CA2227 使用 Dictionary 的解决方法是啥?

Posted

技术标签:

【中文标题】CA2227 使用 Dictionary 的解决方法是啥?【英文标题】:CA2227 With Dictionary what is the fix?CA2227 使用 Dictionary 的解决方法是什么? 【发布时间】:2012-01-31 12:56:09 【问题描述】:
public Dictionary<string, string> Data  get; set; 

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

有没有什么方法可以在不添加 Stylecop 抑制或创建我自己的只读字典类的情况下克服这个错误?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

谢谢。我确实尝试过类似的东西,但不完全是这样的日子!【参考方案2】:

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

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

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

【讨论】:

不同意。 Stylecop 和 FxCop 很棒。修复所有违反 FxCop 的行为是愚蠢的(另一方面,修复开发团队选择的所有 stylecop 规则是个好主意),但了解产生的警告总是是个好主意。 我确实尝试过,但我得到了 CA1811: set 似乎没有上游公共或受保护的调用者。哦,我多么喜欢 Style/Fx Cop! @Tyler:在构造函数中赋值给Data @leppie 当然这是我的意见。这就是为什么我说“不同意”,而不是“你错了”,以及为什么我没有对你的回答投反对票。但我非常不同意,我认为应该始终使用 Stylecop,尤其是对于团队工作(并非所有开发人员都有相同的风格,并且在调试时拥有同质代码是至关重要)和代码分析将有助于发现潜在的关键问题(您的 C# 编译器不会告诉您 50% 的同事的 IDisposable 实现写得不好)... @leppie BTW,FxCop(代码分析)与 style 无关。它是关于设计、可移植性、可维护性、性能、可靠性、安全性...等【参考方案3】:

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

请参阅this MSDN article,这对问题的解释非常不言自明。

尝试以下(private setter)来修复它:

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

【讨论】:

【参考方案4】:

我不认为 CA2227 要求您提供只读的Dictionary&lt;,&gt;。而是 StyleCop 抱怨您可以直接设置 Dictionary。您应该删除 setter 和/或将其设为私有以消除警告。此外,您的班级可能会提供您自己的AddClear 方法。详情请见http://msdn.microsoft.com/en-us/library/ms182327%28VS.80%29.aspx。

【讨论】:

【参考方案5】:

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

myThing.Items = GetItems();

开发人员修复了它:

var items = GetItems();

foreach (var item in items)

    myThing.Items.Add(item);

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

【讨论】:

以上是关于CA2227 使用 Dictionary 的解决方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Exercise 39 - dictionary

数字证书,签名,CA 简述

Redis(Remote Dictionary Server)

如何搭建CA

如何在不出现 C2227 错误的情况下调用此方法?

使用ISerializationCallbackReceiver解决HashSet/Dictionary无法序列化的问题