集合属性应该是只读的-错误?在遵守代码分析错误的过程中,我正在更改我的属性以拥有一个私有设置器。然后我开始尝试更多地理解为什么。根据一些研究,MS说:可写集合属性允许用户用一个完全不同的集合替换一个集合。这里的答案是:在List对象上添加公共setter是危险的。但它没有列出危险的原因。这就是我很好奇的部分。如果我们有这个集合:publicListFoos{get;放;为什么让setter私有?显然我们不希望客户端代码替换集合,但如果客户端可以删除每个元素,然后添加他们想要的任何内容,那又有什么意义呢?这不等于完全替换系列吗?遵循此代码分析规则如何提供价值?不公开setter会阻止为集合分配null值。null和没有任何值的集合是有区别的。考虑:for(varvalueinthis.myCollection){//dosomething当没有值时(即有人对每个值调用Remove),没有什么不好的事情发生。但是,当this.myCollection为null时,将抛出NullReferenceException。代码分析假设您的代码在操作之前不检查myCollection是否为null。它也可能是System.Collections.Concurrent定义的线程安全集合类型的附加安全措施。想象一下,某个线程试图通过覆盖来替换整个集合。通过删除公共setter,线程的唯一选择是调用线程安全的Add和Remove方法。如果您公开一个IList(这将是更好的做法),消费者可以用一个完全不同的实现IList的类替换该集合,这可能会产生不可预知的效果。您可以订阅该集合上的事件,或订阅您现在响应错误的集合中的项目。除了SimpleCoder的空值检查(当然这很重要)之外,您还需要考虑其他事项。为了阐明第3点,创建一个名为clearOrders()的函数,而不是执行cust.Orders.clear()。如果不允许客户超过信用额度怎么办?如果名单公开,就无法控制。您必须检查(连同所有其他业务逻辑)在每个可以添加订单的地方。哎呀!这有很多潜在的错误。相反,您可以将其全部放在addOrder(Ordero)函数中,它会像下雨一样。对于几乎每一个(我会说每一个,但有时欺骗感觉很好......)商务舱,每个属性都应该是私有的,以便获取和设置,并且在可行的情况下也将它们设为只读。通过这种方式,您的类的用户只能使用行为。尽可能保护您的数据!ReadOnlyCollection和ReadOnlyObservableCollection只存在于只读集合场景。ReadOnlyObservableCollection对于WPF/Silverlight/Metro应用程序中的单向绑定很有用。如果您的Customer类有一个List属性,这个属性应该总是有一个私有的setter,否则它可以从客户对象外部通过以下方式更改:customer.Orders=newList//这可能会覆盖数据。始终使用集合的添加和删除方法。订单列表应在Customer构造函数中通过以下方式创建:Orders=newList();您真的要检查所有customer.Orders!=null订单的代码customer.Orders!=null然后对订单进行操作吗?或者您按照建议在客户对象中创建Orders属性,从不检查customer.Orders==null,而只是枚举订单,如果它的计数为零,则什么也不会发生……以上是C#学习教程:应阅读集合属性只有——漏洞?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
