1

在我的 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:\用户...\Visual Studio 2008\Projects\CA2227\MyClass.cs 7 CA2227

4

3 回答 3

2

AReadOnlyCollection不能更改,但是没有理由ReadOnlyCollection不能更改具有类型的 setter 的属性以引用不同的ReadOnlyCollection. 如果您希望该SomeNumbers属性是不可变的,那么它需要既是只读类型,又要有一个非公共的 setter。

编辑

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

于 2010-04-30T08:15:56.107 回答
1

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

public ReadOnlyCollection<int> SomeNumbers { get; private set; }
于 2010-04-30T12:33:33.453 回答
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

于 2013-11-16T01:57:17.777 回答