在我的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
答案 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