Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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# 应该列出一份清单<;T>;要保密吗?_C#_List_Visibility - Fatal编程技术网

C# 应该列出一份清单<;T>;要保密吗?

C# 应该列出一份清单<;T>;要保密吗?,c#,list,visibility,C#,List,Visibility,我需要你的意见,因为我读了很多关于这个主题的不同的东西。如果在类声明中有一个列表或任何类型的列表,您是将其设置为私有,然后使用特定方法添加或删除项,还是将其设置为公共 如果您的观点有任何缺点/优点,我们将不胜感激 举一个例子,假设我们有一个类雇主,带有私有字段名称和列表。我的问题是,我们应该将员工列表设置为私有还是公共,以及这两种情况的优点/缺点是什么。如果您需要向类的用户公开一个集合,您应该使用 然后,您可以继承此类并重写InsertItem、removieItem和SetItem,以便在用户

我需要你的意见,因为我读了很多关于这个主题的不同的东西。如果在类声明中有一个
列表
或任何类型的列表,您是将其设置为私有,然后使用特定方法添加或删除项,还是将其设置为公共

如果您的观点有任何缺点/优点,我们将不胜感激


举一个例子,假设我们有一个
类雇主
,带有私有字段
名称
列表
。我的问题是,我们应该将员工列表设置为私有还是公共,以及这两种情况的优点/缺点是什么。

如果您需要向类的用户公开一个集合,您应该使用

然后,您可以继承此类并重写
InsertItem
removieItem
SetItem
,以便在用户操作集合时运行自定义逻辑

如果不希望用户能够更改集合,则应公开一个


在您的特定示例中,您可能应该在
Employer

中使用单独的mutator方法公开一个
ReadOnlyCollection
,具体取决于您想要的功能。如果您只是希望人们能够操纵列表,那么可以通过只读属性(不使用setter)公开它。如果您希望在用户操作列表时执行额外的代码,您应该编写自己的方法,而不是公开列表。

对于“列表显式是”,它应该是私有的,具体取决于您公开的功能应该做什么,接口如IEnuemerable,ICollection或IList将是更好的选择,或者如果您要公开一个集合,请参阅SLaks回复

通常,公开内部结构和状态是一个坏主意,因为您的List类型的对象是两者,所以您希望将其保持在内部。 允许用户对其进行迭代、添加或删除项可能是有意义的,但您仍应将列表保持在内部,并公开添加/删除方法,或者至少公开一个接口,从而可以在不影响公共接口的情况下更改内部表示的类型

此外,如果使用接口进行公开,则应选择最窄的接口

因此,如果客户端代码只需要枚举它。如果客户机代码需要索引,请使用IEnumerable;使用ICollection等等

此外,如果将其公开为IEnumerable,则应确保通过使用只读集合类或迭代器块,返回的内容实际上是只读的

更新后编辑
关于你的例子。问问你自己,除了雇主之外,任何人都可以改变他的雇员是谁,这有意义吗?对我来说,这就是你已经选择的词语。雇主雇用该雇员,并应完全控制其雇员的身份。因此,在这种特殊情况下,我会将其保密,并以这种方式公开雇佣(IEEmployee employee)和解雇(IEEmployee employee employee),代码清楚地说明了意图,根据重构目录,封装集合总是更好的。这可以防止某些人通过在列表中添加或删除项目而意外地损坏数据。如果您不需要保护数据不受意外更改影响的功能,可以返回正常列表


通过公开Add和Remove方法,您可以获得这样的优势,即任何更改都只能通过这些方法进行。

如果您只希望有人能够枚举列表,您可以公开一个iEnumerable,它的GetEnumerator函数只需调用列表的GetEnumerator函数。

您可能需要在上下文中进行一些扩展。这是一个非常广泛的问题,几乎没有上下文信息,因此很难给您一个准确的答案为什么DonoteExposeGenericList[Fxcop规则]建议我公开集合而不是列表?为什么特别是
Collection
?当然,这取决于您要公开的功能:
IList
ReadOnlyCollection
IEnumerable
等是其他一些可能的功能。@LukeH:还记得通过强制转换修改攻击吗。然而,你是对的;将
集合
公开为
IList
返回列表没有错。选择(a=>a)
@slaks:或
返回列表.ToList()
@Andreas从客户端看可能会产生一些奇怪的行为。例如,var list=propertyReturningList();添加(某物);list.count!=propertyReturningList().Count;这很可能不是我们所期望的,我们会写同样的东西。。。但既然他说得比我好得多+1.