在多种方法中处理变量的正确方法是什么?

时间:2012-07-27 17:42:19

标签: c#

说我有List<Objects>。我想在一个方法中定义对象列表,并在其他几个方法中使用它们。

以下是我提出的方法,我正在寻找更多或正确的方法。

  1. 您可以在使用它的每个方法中定义List<Objects>
    • 优点:它有效。没有机会得到错误的变量。
    • 缺点:代码重复。
  2. 您可以使用课程中定义的私有List<Objects>并使用(ref ListObjects)进行更新
    • 优点:我只需要定义一次。
    • 缺点:我觉得这是一种混乱和糟糕的做法。
  3. 您可以将List<Objects>作为参数传递给使用它的方法。
    • 优点:防止代码重复
    • 缺点:必须使我的populate函数返回函数,并将参数添加到我的其他方法中。可能与事件冲突?
  4. 这就是我想出来的。我真的不确定使用哪个或者有更好的方法来做到这一点。想法?

    编辑:根据要求包含一些代码。

    private List<MedicalPlan> medicalPlansList;
    

    这是清单。它是一个从数据库中获取信息的列表,在这里:

    private void BindMedicalList()
    {
       medicalPlansList = new MedicalPlanRepository().RetrieveAll().Where(x => x.Year == year).ToList();
    }
    

    然后它用于查找该列表中的对象,例如

    var result =
                        medicalPlansList.FirstOrDefault(
                            c => c.CoverageLevels.Any(p => p.Id == id));
    

4 个答案:

答案 0 :(得分:2)

一般来说,这是我怎么做的。如果始终在列表中使用相同的函数序列,请考虑创建一个链式函数来处理它。你也可以在其他一个函数调用中直接传递一个函数调用(只要它返回一个列表),但这看起来很麻烦。

public List<int> DoSomethingWithList(List<int> list)
{
    //do stuff
    return list;
}

public List<int> DoSomethingElseWithList(List<int> list)
{
    //do other stuff
    return list;
}

public void SomeOtherFunction(string[] args)
{
    var list = new List<int>() { 1, 2, 3, 4 }; //create list
    list = DoSomethingWithList(list); //change list
    list = DoSomethingElseWithList(list); //change list further
}

如果您正在使用具有List<T>字段的对象,我会这样做:

public class MyBigClass
{
    private List<int> myList;
    public MyBigClass()
    {
        //instantiate list in constructor
        myList = new List<int>() { 1, 2, 3, 4 }; 
    }

    public void PublicListAdder(int val)
    {
        myList.Add(val);
    }

    private void PrivateListCleaner()
    {
        //remove all even numbers, just an example
        myList.RemoveAll(x => x % 2 == 0);
    }
}

您很少需要在C#中使用ref,因为它会自动为您处理指针。你(通常)没有传递一个结构,你传递一个对象引用(基本上是一个指针)。

答案 1 :(得分:0)

你的#1和#2真的没有意义:

  1. 如果在每个使用它的方法中定义不同的列表,那么每次都使用不同的列表。这不是共享列表;这个没有工作。如果您的意思是“调用从每个使用它的方法创建列表的方法”,那么仍然适用:您每次都使用不同的列表。
  2. 您无需使用ref ListObjects来更新私人会员;私人成员只是通过其名称访问。这不是坏习惯;这是标准的面向对象实践。
  3. 将所有必需的数据传递给方法作为参数使该方法本身更具可重用性,因为它减少了与方法所属类的耦合。
  4. 简而言之:#3在某种程度上是良好的做法,因为它增加了代码的可重用性。但是,#2的使用从根本上说是我们进行面向对象编程的原因:保存您不必重复将参数传递给所有方法。这正是私人领域的设计目标!

答案 2 :(得分:0)

在大多数情况下,我可能会选择安德斯的回答。根据您的情况,另一种值得考虑的方法是为List编写extension methods

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static object DoSomething(this List<T> list)
        {
            //do the something with list
        }
    }   
}

然后你可以这样使用它:

var list = new List<int>();
list.DoSomething();

在该示例中,list作为参数传递给扩展方法。

答案 3 :(得分:-1)

通常List<T>不应该属于实例的状态并且因为它是可变的而暴露,并且你可以从外部改变状态,否则你的getter被设计为返回一个只读列表。除非您的设计在可能发生时明确允许这种可能性。我的回答并没有真正回答你的问题只是一个良好的面向对象设计的建议。正如某人已经建议的要好得多,你可以在每个方法中来回传递List并直接修改它。