【问题标题】: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 抑制或创建我自己的只读字典类的情况下克服这个错误?

【问题讨论】:

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


    【解决方案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 和/或将其设为私有以消除警告。此外,您的班级可能会提供您自己的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中要强一点!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-02
          • 2020-12-27
          • 2021-10-22
          • 2012-10-10
          • 2010-10-10
          • 2010-11-08
          • 1970-01-01
          相关资源
          最近更新 更多