我有以下模式:
public class Test
{
public ICollection<string> Stuff { get; private set; }
public Test()
{
Stuff = new List<string>();
Stuff.Add("Initial Item");
}
}
FxCop正在向CA2227抱怨:CollectionProperties ShouldBeReadOnly。为什么?setter是私有的,所以它与拥有私有字段没有什么不同,只是它的语法更短、更整洁。
这对我来说是一种非常常见的模式,我真的不想单独抑制每个警告或用字段+属性模式替换它。
有办法绕过这个吗?
编辑:
是的,制作私人set
应该像readonly
一样,但我想FxCorp没有考虑到这一点。您可以忽略该规则,也可以使用readonly
来支持私有字段。我认为这是可以安全地忽略FxCorp规则的一些情况。无论如何,它们更像是一个指导方针。
另一种方法是使用私有ICollection<string>
,然后公开您自己的方法来添加和删除集合中的项。这将删除FxCorp中的警告。
老答案:
通过拥有私有set
,可以防止它被初始化/设置为类外的新值,但不会阻止任何人在集合中添加任何内容。从课外你仍然可以做:
Test t = new Test();
t.Stuff.Add("Something");
因此,您的收藏不是只读的。
您还可以看到Jon Skeet关于将集合公开为属性的文章
问题似乎已经自行解决。