CA2227 With Dictionary有什么问题?

时间:2012-01-31 12:56:09

标签: c# asp.net-mvc-3 dictionary fxcop

public Dictionary<string, string> Data { get; set; }

使用上面的代码行我得到样式警察错误,CA2227集合属性应该是只读的。

在没有添加Stylecop抑制或必须创建自己的只读字典类的情况下,是否有某些方法可以移除此错误?

5 个答案:

答案 0 :(得分:7)

您似乎只需要删除“set”关键字。像这样:

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

public Dictionary<string, string> Data { get { return this.data; } }

通常,您不需要重新分配集合,而只需清除现有集合。 我猜这是警告的来源。上面的示例是我大部分时间都在使用的方法。

答案 1 :(得分:3)

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

public Dictionary<string, string> Data { get; private set; }

说实话,由于某人对风格的主观想法(又名StyleCop和FxCop),阻碍你的发展是愚蠢的。

答案 2 :(得分:2)

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

请参阅this MSDN article,该问题非常明显。

尝试以下操作(私有设置器)来修复它:

public Dictionary<string, string> Data { get; private set; }

答案 3 :(得分:2)

我不认为CA2227会要求您提供只读Dictionary<,>。而StyleCop抱怨你可以直接设置字典。你应该删除setter和/或将其设为私有以消除警告。此外,您的课程可能会提供您自己的AddClear方法。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms182327%28VS.80%29.aspx

答案 4 :(得分:0)

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

myThing.Items = GetItems();

开发人员用以下方法修复:

var items = GetItems();

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

想象一下,GetItems()返回一百万个项目的集合。这怎么可能是件好事?我发现微软声明“不要排除此规则的警告”。在MSDN中有点强大!