FxCop CA2227警告和ReadOnlyCollection <t> </t>

时间:2010-04-30 08:13:11

标签: c#-3.0 code-analysis fxcop visual-studio-2008-sp1 readonly-collection

在我的VS2008 SP1,.NET 3.5 SP1项目中,我有不同的类包含不同的属性。 我经常使用C#3.0自动属性。

其中一些属性需要是集合。由于我想简化,我使用ReadOnlyCollection<T>来表示这些属性。

我不想使用IEnumerable<T>因为我想随机访问元素。

我使用代码分析(FxCop规则),我收到了CA2227警告。

我不明白为什么ReadOnlyCollection<T>应该有set方法而它无法更改... set方法只能完成属性可以做的事情。

示例:

using System.Collections.ObjectModel;

namespace CA2227
{
    public class MyClass
    {
        public ReadOnlyCollection<int> SomeNumbers { get; set; }
    }
}

CA2227:Microsoft.Usage:通过删除属性设置器将“MyClass.SomeNumbers”更改为只读。 C:\ Users ... \ Visual Studio 2008 \ Projects \ CA2227 \ MyClass.cs 7 CA2227

3 个答案:

答案 0 :(得分:2)

无法更改ReadOnlyCollection,但没有理由不能更改具有ReadOnlyCollection类型的setter的属性来引用其他ReadOnlyCollection。如果您希望SomeNumbers属性是不可变的,那么它必须是只读类型,并且还具有非公共设置器。

修改

如果您确信自己想要什么,那么尽管FxCop警告您是正确的,但您对此警告感到满意。如果你想摆脱它,那么在那一点上包含一个SuppressMessage属性 - 只要你在构建之前在项目属性中定义一个CODE_ANALYSIS常量,FxCop将尊重该属性而不发布该特性在那个特殊场合发出警告。

答案 1 :(得分:1)

阻止对集合内容的更改而不阻止对集合本身的更改是相当奇怪的。如果您希望能够在保持使用自动属性的同时在类中设置集合,则可以使用私有setter。 e.g:

public ReadOnlyCollection<int> SomeNumbers { get; private set; }

答案 2 :(得分:0)

考虑使用

public class MyClass
{
    public IReadOnlyList<int> SomeNumbers { get; set; }
}

ReadOnlyCollection = http://msdn.microsoft.com/en-us/library/ms132474(v=vs.110).aspx

IReadOnlyList = http://msdn.microsoft.com/en-us/library/hh192385(v=vs.110).aspx

ReadOnlyCollection的问题在于它仍然继承自ICollection,并且仍然有.Add,即使文档说它会抛出 - http://msdn.microsoft.com/en-us/library/cc672239(v=vs.110).aspx