Bob*_*orn 4 c# oop code-analysis
在遵守代码分析错误的过程中,我正在将我的属性更改为拥有私有的setter.然后我开始尝试理解为什么多一点.从一些研究,MS说这个:
可写集合属性允许用户使用完全不同的集合替换集合.
答案在这里指出:
在
List<T>对象上添加公共setter 是危险的.
但它没有列出危险的原因.这就是我很好奇的部分.
如果我们有这个集合:
public List<Foo> Foos { get; set; }
Run Code Online (Sandbox Code Playgroud)
为什么要将setter设为私有?显然我们不希望客户端代码替换集合,但如果客户端可以删除每个元素,然后添加他们想要的东西,那有什么意义呢?这与完全替换集合不一样吗?遵循此代码分析规则如何提供价值?
不公开setter可以防止为集合分配值的情况null.null没有任何值的集合和集合之间存在差异.考虑:
for (var value in this.myCollection){ // do something
当没有值(即有人调用Remove每个值)时,没有任何不好的事情发生.this.myCollection但是,如果为null,则NullReferenceException抛出a.
代码分析假设您的代码myCollection在对其进行操作之前不检查为null.
它可能也是对其中定义的线程安全集合类型的额外保护System.Collections.Concurrent.想象一下,一些线程试图通过覆盖它来替换整个集合.通过摆脱公共setter,线程唯一的选择是调用线程安全Add和Remove方法.