Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# - Fatal编程技术网

C# 以这种方式修改列表是一种糟糕的做法吗?

C# 以这种方式修改列表是一种糟糕的做法吗?,c#,C#,在类A中(如果列表不为空,将输出什么): 编辑列表是不是像这样的糟糕做法?还是可以 编辑:我只是在我的方法需要返回其他内容(bool、object、string等)时才这样添加到列表中。这是一种非常常见的做法。不太常见的是将集合公开。将其设置为私有,初始化构造函数上的列表,就可以了 public ObservableCollection<int> MyPublicList {get; private set;} public observeCollection MyPublicLi

在类A中(如果列表不为空,将输出什么):

编辑列表是不是像这样的糟糕做法?还是可以


编辑:我只是在我的方法需要返回其他内容(bool、object、string等)时才这样添加到列表中。

这是一种非常常见的做法。不太常见的是将集合公开。将其设置为私有,初始化构造函数上的列表,就可以了

public ObservableCollection<int> MyPublicList {get; private set;}
public observeCollection MyPublicList{get;private set;}

WPF中充满了这样的声明。

这是一种非常常见的做法。不太常见的是将集合公开。将其设置为私有,初始化构造函数上的列表,就可以了

public ObservableCollection<int> MyPublicList {get; private set;}
public observeCollection MyPublicList{get;private set;}

WPF中充满了这样的声明。

您通常不应该这样做

您向类的客户机公开了一个非常大的接口,这使得测试您的类在所有情况下是否都能工作变得非常困难。如果有人在您不期望的情况下删除了值,会发生什么情况?或者,如果他们添加了超出范围的值怎么办?您无法在调用
列表中的方法时验证它,因此您的类可能会在稍后某个时间点突然中断,而此时可能很难跟踪坏数据的来源


最好在类上有一个
Add
方法,该方法调用列表的
Add
,并保持列表私有。然后你可以控制你的客户做什么,并且只公开他们需要使用的功能(以及你已经测试过的功能)。

你通常不应该这样做

您向类的客户机公开了一个非常大的接口,这使得测试您的类在所有情况下是否都能工作变得非常困难。如果有人在您不期望的情况下删除了值,会发生什么情况?或者,如果他们添加了超出范围的值怎么办?您无法在调用
列表中的方法时验证它,因此您的类可能会在稍后某个时间点突然中断,而此时可能很难跟踪坏数据的来源


最好在类上有一个
Add
方法,该方法调用列表的
Add
,并保持列表私有。然后,您可以控制客户端的操作,并且只公开它们需要使用的功能(以及您已经测试过的功能)。

一般来说,类应该负责管理自己的内部状态。通过向这样的成员提供完全的公众访问权,你基本上是在说a类放弃了该州的责任。它无法对myList包含的内容进行假设,因为任何人都可以随时更改它

这是否好取决于您的意图,但它肯定与解耦和封装的思想背道而驰。同样,是否需要解耦和封装取决于您


一个更好的问题是确定类A和类B之间哪种类型的解耦对您的设计最有利,然后您就可以决定要公开的成员以及如何公开。

一般来说,类应该负责管理自己的内部状态。通过向这样的成员提供完全的公众访问权,你基本上是在说a类放弃了该州的责任。它无法对myList包含的内容进行假设,因为任何人都可以随时更改它

这是否好取决于您的意图,但它肯定与解耦和封装的思想背道而驰。同样,是否需要解耦和封装取决于您


更好的问题是确定类A和类B之间的哪种解耦对您的设计最为有利,然后您可以决定要公开的成员以及如何公开。

一如既往,这取决于您的设计。如果要在类之外编辑列表(它是该类接口的一部分),并且允许所有常规列表操作,则可以。如果只允许操作的一个子集,那么您不应该像这样使用它-使用强制所有约束的自定义列表(或围绕列表的包装器)。例如,如果列表必须在类外部是只读的,那么可以在类外部提供包装器。这一切都归结为加强数据完整性。

一如既往,这取决于具体情况。如果要在类之外编辑列表(它是该类接口的一部分),并且允许所有常规列表操作,则可以。如果只允许操作的一个子集,那么您不应该像这样使用它-使用强制所有约束的自定义列表(或围绕列表的包装器)。例如,如果列表必须在类外部是只读的,那么可以在类外部提供包装器。这一切都归结为强制执行数据完整性。

这取决于您是否关心列表是否公开。通过公开和访问一个公共的、具体的类型,您公开了一个实现细节,并增加了类与其使用者之间的耦合。您还限制了
ClassA
实现数据一致性的机会,因为它的实现细节不再被正确封装

有时候,这是完全可以接受的,有时候,它不是

我想说,在对象模型是哑的情况下,这是可以接受的。所谓哑,我的意思是它只包含数据。在将JSON/XML解析为对象时,经常会出现这样的情况——事物的结构是为了镜像数据,而行为实际上并不重要,因为很少。如果您只是在一个小的代码库中进行黑客攻击,并且/或者更改的范围有限,或者所涉及的行为很少,那么这也是可以接受的

不过,我通常会避免这样做

首先,假设您添加到
ClassA
”的项目
public ObservableCollection<int> MyPublicList {get; private set;}