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