Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该选择封闭列表还是开放列表<&燃气轮机;系统?_C#_.net_List - Fatal编程技术网

C# 我应该选择封闭列表还是开放列表<&燃气轮机;系统?

C# 我应该选择封闭列表还是开放列表<&燃气轮机;系统?,c#,.net,list,C#,.net,List,我的项目中有一个类,它存储元素列表。我试图弄清楚是否应该允许用户直接添加到该列表(例如,调用本机添加/删除方法)或通过将列表声明为私有并只允许我选择的少数方法实际更改列表来锁定它 这是一个框架,所以我试图尽可能地设计它,但我也希望尽可能地保持它的简单和无错误 在这种情况下,最好的做法是什么 谢谢, Tyler保持列表的私有性可以让您获得更多的控制权,并可能使其更加健壮(您可以在将值接受到列表中之前检查值) 但是将其公开是最简单的。您可以对列表进行子分类,并覆盖修改列表内容的方法。在覆盖中,您可以

我的项目中有一个类,它存储元素列表。我试图弄清楚是否应该允许用户直接添加到该列表(例如,调用本机添加/删除方法)或通过将列表声明为私有并只允许我选择的少数方法实际更改列表来锁定它

这是一个框架,所以我试图尽可能地设计它,但我也希望尽可能地保持它的简单和无错误

在这种情况下,最好的做法是什么

谢谢,
Tyler

保持列表的私有性可以让您获得更多的控制权,并可能使其更加健壮(您可以在将值接受到列表中之前检查值)


但是将其公开是最简单的。

您可以对列表进行子分类,并覆盖修改列表内容的方法。在覆盖中,您可以执行其他处理以防止修改列表,也可以触发事件以便在列表更改时收到通知。如果您想完全禁用该方法,甚至可以不在覆盖中调用基本实现,并抛出NotSupportedException。

这实际上取决于您正在做什么

就个人而言,当我在一个自定义类中有一个列表,并且它向一个数据绑定控件提供(比如)一个业务实体列表时,我会将其设置为私有,并公开几个简单的公共方法来更新它,我可以在其中添加额外的代码,比如移动数据等等

但是,如果列表是某个查询的结果,那么最好公开整个列表,并能够使用所有扩展方法等来处理它


这是关于在上下文中什么最适合框架的问题,在我看来,您应该始终保持变量的私密性。有关详细信息,请参见Jon Skeets。基本上是因为您希望控制如何处理数据。用户不需要知道它是列表还是其他内容

如果您使用的是.NET 3.5或更高版本,则可以私下使用列表并将公共属性设置为ReadonlyCollection。这也是线程安全的,但可能需要您做一些工作


对于这类问题,我可以推荐。它分析您的代码,并为您提供设计、性能等方面的提示。

对于一个框架,我建议完全封装该列表,并创建检索和添加元素的方法

如果需要检查添加的元素,或者需要为某些操作触发事件,那么您就可以这样做

如果出于任何原因希望以不同的方式存储这些元素,则可以


另一方面。如果您允许直接访问列表,则很难返回并封装它,或者更改它并使用其他内容。使用此框架的代码可能完全依赖于对列表的直接访问。

@Dylan Vester:因为您应该更喜欢组合而不是继承,所以不要继承列表。您可能希望稍后将其更改为不同的数据结构,或者在添加到列表之前执行某种验证/检查。

然后您可以将新的子类列表公开,并让用户像平常一样使用该列表。虽然NotSupportedException可以工作,这不是一个很好的设计。这取决于你实际上禁用了什么。您希望仍然允许他们从列表中添加/删除条目。在修改方面,该清单还提供了什么。很可能,你甚至不需要使用NotSupportedException。我刚才提到NotSupportedException是一种禁用方法的方法,如果你绝对需要的话。以LINQtoSQL为例,必须将集合公开为某个对象的IQueryable,这实现了IEnumerable,List也实现了IEnumerable。从内置类型继承是完全可以接受的,并且仍然保留查询时获得的所有附加扩展方法,但是添加应用程序可能需要的自己的逻辑。既然可以继承并保留现有类型的功能,为什么要封装呢?我想封装它会更好-那样,只向用户显示所需的内容。然而,当在foreach情况下使用列表时,它似乎不像我见过的其他一些框架那样直观。例如,如果我要创建一个自定义方法来获取列表枚举数,我的foreach语句将是:foreach(Card-Card-in-Pile.GetCardEnumerator()){…},但我见过的其他框架可能会这样使用它:foreach(Card-Card-in-Pile.Cards){…}我想第二种选择似乎更好?主要是因为它让你可以自由地改变处理这些元素的方式。这是一个正确的观点,但是,有时候能够使用人们已经熟悉的东西是很好的,比如列表对象。话虽如此,关于只公开您所需的方法和属性的封装还是有一些需要说的,通过这样做,您可以更容易地学习和使用这些方法和属性。