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<,>
。而是 StyleCop 抱怨您可以直接设置 Dictionary。您应该删除 setter 和/或将其设为私有以消除警告。此外,您的班级可能会提供您自己的Add
和Clear
方法。详情请见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 的解决方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Redis(Remote Dictionary Server)
使用ISerializationCallbackReceiver解决HashSet/Dictionary无法序列化的问题