C# 什么';跨多个方法处理变量的正确方法是什么?

C# 什么';跨多个方法处理变量的正确方法是什么?,c#,C#,假设我有一个列表。我想在一个方法中定义对象列表,并在其他几个方法中使用它们 以下是我想出的方法,我正在寻找更多或正确的方法 您可以在使用它的每个方法中定义List。 优点:它很有效。不可能得到错误的变量 缺点:代码重复 您可以使用类中定义的私有列表,并使用(ref ListObjects) 优点:我只需要定义一次 缺点:我觉得这是一种混乱和糟糕的练习 您可以将List作为参数传递给使用它的方法。 优点:防止代码重复 缺点:必须使我的填充函数返回函数,并向我的其他方法添加参数。可能与事件

假设我有一个
列表
。我想在一个方法中定义对象列表,并在其他几个方法中使用它们

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

  • 您可以在使用它的每个方法中定义
    List
    • 优点:它很有效。不可能得到错误的变量
    • 缺点:代码重复
  • 您可以使用类中定义的私有
    列表
    ,并使用
    (ref ListObjects)
    • 优点:我只需要定义一次
    • 缺点:我觉得这是一种混乱和糟糕的练习
  • 您可以将
    List
    作为参数传递给使用它的方法。
    • 优点:防止代码重复
    • 缺点:必须使我的填充函数返回函数,并向我的其他方法添加参数。可能与事件发生冲突
  • 这就是我想到的。我真的不知道该用哪一种,或者是否有更好的方法。想法

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

    private List<MedicalPlan> medicalPlansList;
    
    然后,它用于查找该列表中的对象,例如

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

    一般来说,我会这样做。如果总是在列表中使用相同的函数序列,请考虑创建链式函数来处理该函数。您也可以直接在其他函数调用中传递函数调用(只要它返回一个列表),但这看起来很混乱

    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
    }
    
    公共列表DoSomethingWithList(列表列表)
    {
    //做事
    退货清单;
    }
    公共列表DoSomethingElseWithList(列表列表)
    {
    //做其他事情
    退货清单;
    }
    public void SomeOtherFunction(字符串[]args)
    {
    var list=new list(){1,2,3,4};//创建列表
    list=DoSomethingWithList(list);//更改列表
    list=DoSomethingElseWithList(list);//进一步更改列表
    }
    
    如果您使用的对象具有
    列表
    字段,我会这样做:

    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);
        }
    }
    
    公共类MyBigClass
    {
    私人名单;
    公共MyBigClass()
    {
    //在构造函数中实例化列表
    myList=新列表(){1,2,3,4};
    }
    public void PublicListAdder(int val)
    {
    myList.Add(val);
    }
    私有无效私有清除器()
    {
    //删除所有偶数,仅举一个例子
    myList.RemoveAll(x=>x%2==0);
    }
    }
    
    在C#中很少需要使用
    ref
    ,因为它会自动为您处理指针。您(通常)不是在传递结构,而是在传递对象引用(基本上是指针)。

    通常
    列表不应属于实例的状态并公开,因为它是可变的,您可以从外部更改状态,否则-除非您的getter设计为返回只读列表。除非您的设计明确允许出现这种情况。我的回答并没有真正回答你的问题,只是对良好的面向对象设计的建议。正如已经有人提出的比我好得多的建议,您可以来回传递每个方法的列表,并直接修改它。

    您的#1和#2没有真正意义:

  • 如果在每个使用它的方法中定义不同的列表,那么每次都使用不同的列表。这不是共享列表;这不管用。如果您的意思是“调用从使用列表的每个方法创建列表的方法”,那么同样的情况仍然适用:您每次都使用不同的列表
  • 您不需要使用
    ref ListObjects
    来更新私有成员;私有成员仅通过其名称进行访问。这不是坏习惯;这是标准的面向对象实践
  • 将所有必需的数据作为参数传递到一个方法中,使该方法在本质上更易于重用,因为它减少了与该方法所属类的耦合

  • 简而言之:#3在某种程度上是一种好的实践,因为它提高了代码的可重用性。然而,使用#2从根本上说是我们使用面向对象编程的原因:避免重复向所有方法传递参数。这正是私有字段的设计目的

    在大多数情况下,我可能会同意安德斯的回答。根据您的情况,另一种值得考虑的方法是为列表编写

    namespace ExtensionMethods
    {
        public static class MyExtensions
        {
            public static object DoSomething(this List<T> list)
            {
                //do the something with list
            }
        }   
    }
    
    命名空间扩展方法
    {
    公共静态类MyExtensions
    {
    公共静态对象剂量测量(此列表)
    {
    //用列表做某事
    }
    }   
    }
    
    然后你可以这样使用它:

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

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

    为什么需要
    ref
    ?您可以传递
    List
    并对其进行变异…@proseidon
    List
    是一个类,因此它是一个引用类型。当您有一个
    List
    类型的变量时,它实际上并不包含整个列表,而是包含对该列表的引用。通过使用<代码> REF参数是指针指针的C++等价物。在这种情况下,您不需要这样做。为了消除何时使用
    ref
    的混淆,请阅读@JonSkeet关于C#parameters的文章:@proseidon好吧,没有代码很难说,但似乎您定义了一个列表变量,但实际上从未为其分配过列表实例。@proseidon根据您提供的代码片段,如果调用第二个方法时列表为空,则表示从未首先调用
    Bind
    方法(至少不在同一对象实例上)。如果您这样做了,那么它要么后来被设置为null,要么创建列表时出错。我不同意您对#1的评论。你认为他需要分享这份名单。这不是一个明确的要求。如果每个方法只读取数据,那么它是否共享并不重要。也有可能是
    var list = new List<int>();
    list.DoSomething();