c# - 列表属性 setter

标签 c# list encapsulation

当为 List 属性(在 C# 中)实现 setter 时,这样写是不是一件坏事:

    private List<string> _TheList = new List<string>();
    public List<string> TheList
    {
        get { return _TheList; }
        set { _TheList = value; }
    }

是不是应该写成:

    private List<string> _TheList = new List<string>();
    public List<string> TheList
    {
        get { return _TheList; }
        set { _TheList = new List<string>(value); }
    }

直到今天,我通常都使用前者,但最近我发现了一些使用后者的代码,看起来这可能是实现它的正确方法。

当对分配给它的外部列表进行更改时,使用前者不会导致 TheList 属性发生更改。例如:

List<string> list = new List<string>();
list.Add("Hello");

var c = new someClass();
c.TheList = list;

使用前者,下面的代码不会破坏对TheList的封装:

list.Clear();

现在c.TheList也是空的,这可能不是我们想要的。然而,使用后一种方法,c.TheList 不会被清除。

最佳答案

Collection properties should be readonly .

Your property should expose a Collection<T> , not a List<T> .

编辑:解释:

如果其他代码复制了对该列表的引用(例如 var list = Thingy.TheList ),如果您将该属性设置为不同的列表,它可能会变得困惑。 (它最终会抱着一个孤儿)
通常,很少有理由允许人们将属性指向不同的集合实例。

使用 Collection<T>而不是 List<T>允许您拦截对集合的更改并添加验证或维护父字段。 (通过继承 Collection<T> 并覆盖 InsertItem 和其他方法)您甚至可以在不破坏调用代码的情况下在运送库后添加此类逻辑。

关于c# - 列表属性 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4400804/

相关文章:

swift - Apple 库 (CoreGraphics) 似乎将声明和定义分开 (Swift)

unit-testing - 类方法应该接受参数还是使用类属性

c# - 将 Python 标准输入/输出重定向到 C# 表单应用程序

c# - MySQL Entity Framework 错误 - 在配置中找不到指定的存储提供程序,或者无效

list - Scala:删除对象列表中的重复项

java - 在 Java 中按多个属性对对象进行分组的一般方法

C# 为什么不能进行委托(delegate)覆盖?

c# - NuGet 和夜间构建

Python 列表索引超出范围

c# - 制作只读本地字符串 C#