C# CA2227与字典有什么关系? 公共字典数据{get;set;}

C# CA2227与字典有什么关系? 公共字典数据{get;set;},c#,asp.net-mvc-3,dictionary,fxcop,C#,Asp.net Mvc 3,Dictionary,Fxcop,在上面的代码行中,我得到了一个样式cop错误,CA2227集合属性应该是只读的 有没有什么方法可以避免这个错误,而不需要添加Stylecop抑制或创建自己的只读字典类 看起来您只需要删除“set”关键字。大概是这样的: public Dictionary<string, string> Data { get; set; } private readonly Dictionary data=new Dictionary(); 公共字典数据{get{返回this.Data;}} 通常

在上面的代码行中,我得到了一个样式cop错误,CA2227集合属性应该是只读的


有没有什么方法可以避免这个错误,而不需要添加Stylecop抑制或创建自己的只读字典类

看起来您只需要删除“set”关键字。大概是这样的:

public Dictionary<string, string> Data { get; set; }
private readonly Dictionary data=new Dictionary();
公共字典数据{get{返回this.Data;}}
通常,您不需要重新分配集合,只需清除现有集合即可。
我想这就是这个警告的来源。上面的示例是我大部分时间使用的方法。

不确定,但以下可能会抑制错误:

private readonly Dictionary<string, string> data = new Dictionary<string, string>();

public Dictionary<string, string> Data { get { return this.data; } }
公共字典数据{get;private set;}
老实说,由于某人对样式(又称StyleCop和FxCop)的主观想法而阻碍您的开发是愚蠢的。

这是一个代码分析(以前称为FxCop)警告,而不是StyleCop。 这是CA2227,不是CA1227

看,这对这个问题来说是不言自明的

请尝试以下(privatesetter)来修复它:

public Dictionary<string, string> Data { get; private set; }
公共字典数据{get;private set;}

我不认为CA2227要求您提供只读
词典。StyleCop抱怨说可以直接设置字典。您应该删除setter和/或将其设置为私有以消除警告。此外,您的类还可以提供自己的
Add
Clear
方法。有关详细信息,请参阅。

我发现这个特别建议/警告的问题是,“修复”的开发人员通常会编写不必要的副本,而不是使用对原始集合的引用。例如,我有以下行:

public Dictionary<string, string> Data { get; private set; }
开发人员通过以下方式修复了它:

myThing.Items = GetItems();

假设GetItems()返回一百万个项目的集合。这怎么可能是件好事?我发现微软在MSDN中关于“不要从这条规则中排除警告”的声明有点强烈

谢谢。我确实尝试过类似的事情,但不完全是,有一天!不同意。Stylecop和FxCop都很棒。修复所有违反FxCop的行为是愚蠢的(另一方面,修复开发团队选择的所有stylecop规则是一个好主意),但理解生成的警告始终是一个好主意。我确实尝试过,但我得到了CA1811:set似乎没有上游公共或受保护的调用方。哦,我多么喜欢Style/Fx警察@泰勒:给构造函数中的
数据赋值。@leppie当然是我的意见。这就是为什么我说“不同意”,而不是“你错了”,以及为什么我没有否决你的答案。但我强烈反对,我认为应该始终使用Stylecop,尤其是在团队工作中(并非所有开发人员都有相同的风格,在调试时使用同构代码是至关重要的),代码分析将有助于发现潜在的关键问题(你的C#编译器不会告诉你同事的
IDisposable
实现中有50%写得很差)@leppie顺便说一句,FxCop(代码分析)与风格无关。它涉及设计、可移植性、可维护性、性能、可靠性、安全性等。
var items = GetItems();

foreach (var item in items)
{
    myThing.Items.Add(item);
}