如果您的类具有客户端可以设置的某种集合属性,则FxCop会抱怨CollectionPropertiesShouldBeReadOnly rule。相反,它建议将属性设置为只读,并提供Clear()方法和Add()或AddRange()方法来更改集合的内容。
我同意这样做可以实现更清晰,更受控制的界面,但我正在努力使该界面与Spring框架协同工作。如果我想配置一个具有协作者集合的对象,我必须公开一些集合属性以将协作者注入。我查看了the Spring documentation,我看不出有什么方法可以告诉Spring调用AddRange()方法,我错过了什么?
现在,我将排除警告,并注意弹簧配置是必要的。
更新,因为我在过去两个月里没有得到任何小吃,我在FxCop forum上发布了同样的问题。
答案 0 :(得分:3)
如果collection属性只暴露了getter,我们将假设您使用的FxCop推荐模式已被使用并添加到集合中。第一种模式也受支持。
对于泛型集合,仅当公开的属性属于IList类型时才有效。我们有一个JIRA issue用于下一个版本来修复此问题。顺便说一句,这是基类库中非常常见的模式(你可能知道......),这是我们第一次遇到需要在.NET 1.1中支持这种风格的地方(它没有受到上面列出的限制) 。
干杯, 标记
答案 1 :(得分:2)
问题是否与您想象的一样糟糕?我的理解是,如果你有这样的读/写属性,FxCop会抱怨:
public List<Foo> Items { get; set; }
...因为您班级的用户可以这样做:
myInstance.Items = new List<Foo>();
显然,您不希望班级用户完全重新分配列表。因此,FxCop推荐这种模式:
private List<Foo> _items = new List<Foo>();
public List<Foo> Items { get { return _items; } }
现在,您班级的用户只能添加和删除列表中的项目,而不是使用新的List实例覆盖它。
Spring.NET如何实现其集合属性?他们真的像我的第一个例子那样读/写吗?如果是这样,看到他们使用这种模式的用例会很有趣,因为它似乎不对。