【问题标题】:FxCop CA2227:CollectionPropertiesShouldBeReadOnly with Private SetFxCop CA2227:CollectionPropertiesShouldBeReadOnly with Private Set
【发布时间】:2014-05-25 15:38:24
【问题描述】:

我有以下模式:

public class Test
{
    public ICollection<string> Stuff { get; private set; }

    public Test()
    {
        Stuff = new List<string>();
        Stuff.Add("Initial Item");
    }
}

FxCop 抱怨 CA2227:CollectionPropertiesShouldBeReadOnly。为什么? setter 是私有的,所以它与私有字段没有什么不同,只是它的语法更短更整洁。

这对我来说是一种非常常见的模式,我真的不想单独禁止每个警告或将其替换为字段 + 属性模式。

有没有办法解决这个问题?

【问题讨论】:

  • 我无法重现该问题。您使用的是哪个版本的 FxCop 和/或 Visual Studio?您的程序集是针对哪个版本的 .NET Framework 构建的?
  • 我认为是 VS 2010 Express、FxCop 10 和 .Net 4.0。
  • 嗯...我在 FxCop 10.0 中针对 VS 2010 中构建并针对 .NET 4.0 的程序集进行了尝试,并且没有违反 CA2227。您是否看到与您发布的确切 Test 类的违规行为?
  • 不,它也突然开始处理我的主要项目。我不知道那里发生了什么。 :(

标签: c# collections private readonly fxcop


【解决方案1】:

编辑:

是的,创建私人 set 应该像 readonly,但我猜 FxCorp 不考虑这一点。您可以忽略该规则,也可以使用readonly 拥有一个支持私有字段。我认为在某些情况下,您可以放心地忽略 FxCorp 规则。无论如何,它们更像是指导方针。

另一种方法是拥有私有ICollection&lt;string&gt;,然后公开您自己的方法来添加和删除集合中的项目。这将从 FxCorp 中删除警告。

旧答案:


通过拥有一个私有的set,您可以防止它在类外部被初始化/设置为一个新值,但您不会阻止任何人在集合中添加任何内容。在课外你仍然可以这样做:

Test t = new Test();
t.Stuff.Add("Something");

因此您的收藏不是只读的。

你也可以看到this post from Jon Skeet about exposing a collection as a property

【讨论】:

  • 这不是规则所涉及的:“返回集合的属性应该是只读的,这样用户就不能完全替换后备存储。用户仍然可以通过调用相关方法来修改集合的内容集合。”
  • @RichardPayne,FxCorp 错误及其编号到底是什么?
  • 错误描述在标题中。编号是 CA2227。
  • @RichardPayne,我现在明白了,是的,创建私人 set 应该像 readonly,但我猜 FxCorp 不考虑这一点。您可以忽略该规则,也可以使用readonly 拥有一个支持私有字段。我认为在某些情况下,您可以放心地忽略 FxCorp 规则。无论如何,它们更像是指导方针。
  • 是的,我知道它们是指导方针,但通常它们似乎是很好的指导方针,所以我一直在努力确保它干净,或者通过修复抑制规则的代码个别实例基础。这是我遇到的第一个似乎是错误的,很遗憾。
【解决方案2】:

问题似乎已经解决了。

【讨论】:

  • 这不是公认的答案。它如何提高社区的知识?最好删除它。
  • 你要我删除什么?答案还是问题?
  • 这个答案没有价值,因为没有人知道如何复制它来解决类似的问题。
  • 它的价值在于让人们知道不必费心进一步调查,因为问题会自行停止。由于我不知道如何复制它,我不确定我还应该说什么?