2

FxCop 有CollectionPropertiesShouldBeReadOnly 规则,如果你的类有某种客户可以设置的集合属性,它会抱怨。相反,它建议将属性设为只读并提供 Clear() 方法和 Add() 或 AddRange() 方法来更改集合的内容。

我同意这会产生一个更清洁、更可控的界面,但我正在努力使该界面与 Spring 框架一起工作。如果我想用协作者集合配置一个对象,我必须公开一些集合属性来注入协作者。我查看了 Spring 文档,但看不到任何方法可以告诉 Spring 调用 AddRange() 方法,我是否遗漏了什么?

现在,我将排除警告,并说明它是 Spring 配置所必需的。

更新:因为在过去的两个月里我没有在这里吃任何东西,所以我在FxCop 论坛上发布了同样的问题。

4

2 回答 2

3

如果集合属性仅暴露了一个 getter,我们将假定您列出的 FxCop 推荐模式已被使用并添加到集合中。还支持第一种模式。

对于泛型集合,这仅在暴露的属性是 IList 类型时才有效。我们在下一个版本中有一个JIRA 问题来解决这个问题。顺便说一句,这是基类库中非常常见的模式(您可能知道......)这是我们第一次遇到需要在 .NET 1.1 中支持这种风格的地方(不受上面列出的限制) .

干杯,马克

于 2008-12-30T20:21:55.760 回答
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 如何实现它的集合属性?他们真的像我的第一个例子那样读/写吗?如果是这样,看看他们对这种模式的用例会很有趣,因为它看起来不正确。

于 2008-12-28T23:27:43.953 回答