1

在我的VS2008 SP1,.NET 3.5 SP1项目中,我有不同的类包含不同的属性。 我使用C#3.0自动属性很多。FxCop CA2227警告和ReadOnlyCollection <T>

其中一些属性需要是集合。由于我想简化它,因此我使用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' 到只读通过去除属性setter。 C:\ Users ... \ Visual Studio 2008 \ Projects \ CA2227 \ MyClass.cs 7 CA2227

回答

2

A ReadOnlyCollection不能改变,但没有理由为什么一个类型为ReadOnlyCollection的setter属性不能被改为指代不同的ReadOnlyCollection。如果你想SomeNumbers属性是不可变的,那么它需要是只读类型,并且也有一个非公有的setter。

编辑

如果你确信你想要的东西,那么虽然FxCop的是正确的警告你,你是幸福的警告。如果你想摆脱它,那么在这一点上包含一个SuppressMessage属性 - 只要你在构建之前在项目属性中定义了一个CODE_ANALYSIS常量,FxCop就会遵守该属性,并且不会针对该特定项发出该特定警告场合。

+1

我想能够更改属性的值。 我不想得到CA2227警告。 我也想理解为什么我要得到CA2227警告以及是否应该以不同方式编写代码。 – brickner 2010-04-30 08:22:52

+0

那么,在一天结束时,这是一个警告,你正在做什么是不寻常的,可能是不正确的。如果你确信你是对的 - 看我的编辑... – 2010-04-30 14:56:24

+1

我不相信。 我想知道为什么我得到这样的警告的ReadOnlyCollection 而不是IEnumerable的。 – brickner 2010-04-30 15:28:13

1

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

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

这为什么这么奇怪? 为什么设置一个IEnumerable (它也不能被修改)并不奇怪,不给CA2227? 我想让二传手公开。我喜欢使用对象初始值设定项 - 它不适用于私人设定项。 – brickner 2010-04-30 13:11:35

+0

这也是不寻常的,让一个IEnumerable 属性的设置,但至少其意图是相当明确的,当一个这样做,类实施者应该大概知道了含义。 我想人们可能认为关于ReadOnlyCollection <>相同,但因为它是目前写入的FxCop规则不检查哪些的ICollection或ICollection的<>实现你暴露。 [接下来的评论] – 2010-05-03 13:33:54

+0

我怀疑你的代码对于真正的“公共”使用可能并不安全。除非您愿意投资检查允许setter调用在任何时候不会导致意想不到的副作用,否则您可能希望将setter可见性降低到内部,在大多数情况下应该消除FxCop违规。 – 2010-05-03 13:36:00

相关问题