【发布时间】:2012-01-31 12:56:09
【问题描述】:
public Dictionary<string, string> Data { get; set; }
使用上面的代码行,我得到了一个样式警察错误,CA2227 Collection 属性应该是只读的。
有没有什么方法可以在不添加 Stylecop 抑制或创建我自己的只读字典类的情况下克服这个错误?
【问题讨论】:
标签: c# asp.net-mvc-3 dictionary fxcop
public Dictionary<string, string> Data { get; set; }
使用上面的代码行,我得到了一个样式警察错误,CA2227 Collection 属性应该是只读的。
有没有什么方法可以在不添加 Stylecop 抑制或创建我自己的只读字典类的情况下克服这个错误?
【问题讨论】:
标签: c# asp.net-mvc-3 dictionary fxcop
看起来您只需要删除“set”关键字。像这样的:
private readonly Dictionary<string, string> data = new Dictionary<string, string>();
public Dictionary<string, string> Data { get { return this.data; } }
通常,您不需要重新分配集合,而只需清除现有集合即可。 我想这就是这个警告的来源。上面的示例是我大部分时间使用的方法。
【讨论】:
不确定,但以下可能会抑制错误:
public Dictionary<string, string> Data { get; private set; }
说实话,由于某人对风格的主观看法(又名 StyleCop 和 FxCop)而阻碍你的发展是愚蠢的。
【讨论】:
Data。
IDisposable 实现写得不好)...
这是一个代码分析(以前称为 FxCop)警告,而不是 StyleCop。 这是 CA2227,不是 CA1227。
请参阅this MSDN article,这对问题的解释非常不言自明。
尝试以下(private setter)来修复它:
public Dictionary<string, string> Data { get; private set; }
【讨论】:
我不认为 CA2227 要求您提供只读的Dictionary<,>。而是 StyleCop 抱怨您可以直接设置 Dictionary。您应该删除 setter 和/或将其设为私有以消除警告。此外,您的班级可能会提供您自己的Add 和Clear 方法。详情请见http://msdn.microsoft.com/en-us/library/ms182327%28VS.80%29.aspx。
【讨论】:
我发现这个特定建议/警告的问题是,“修复它”的开发人员通常最终会编写不必要的副本,而不是使用对原始集合的引用。例如,我有以下行:
myThing.Items = GetItems();
开发人员修复了它:
var items = GetItems();
foreach (var item in items)
{
myThing.Items.Add(item);
}
想象一下 GetItems() 返回一百万个项目的集合。这怎么可能是好事?我发现微软的声明“不要从这条规则中排除警告”。在MSDN中要强一点!
【讨论】: