22

我先说我理解代码分析和 StyleCop 都是作为指导方针的,而且许多人还是选择忽略这些。但话虽如此,我想看看关于这两条规则的普遍共识是什么。

规则 CA1500说不要使参数名称和私有字段名称相同。

另一方面,规则 SA1309说不要在成员前面加上下划线或“m_”。

这使我们几乎没有选择将私有支持字段与其相应参数区分开来。举这些例子。

SA1309 抱怨:

class SomeClass
{
    int _someField;

    public SomeClass(int someField)
    {
        this._someField = someField;
    }
}

CA1500 抱怨:

class SomeClass
{
    int someField;

    public SomeClass(int someField)
    {
        this.someField = someField;
    }
}

我有什么选择?我不想创建私有支持字段 PascalCase,因为这是(我相信相当普遍的)公共字段/属性的约定。而且我不想重命名其中一个,只是为了解决歧义。

所以我只剩下上述两个之一,这将要求我取消 SA/CA 规则之一。

你们一般都做什么?更重要的是,这些规则的作者认为您应该做什么(因为在他们的文档中都没有提供替代解决方案)?

4

6 回答 6

25

我们关闭 SA1309。其背后的推理相当薄弱。

我们的团队认为,私人成员以下划线开头的广为接受的做法远远超过了有人可能在代码上使用不同的编辑器的想法,无论如何,这在我们的商店中从未发生过。至于提供“直接差异化”,下划线也是如此。

如果您确实有开发人员仍然使用“m_”并且您仍然需要检查它,您可以为此编写一个快速规则。

于 2010-07-09T18:19:46.780 回答
3

这是我通常的解决方案:

class SomeClass
{
    int SomeField{get;set;}

    public SomeClass(int someField)
    {
        SomeField = someField;
    }
}
于 2010-07-09T18:18:29.583 回答
2

根据我从微软自己看到的情况,我说 CA1500 胜出。

如果您查看 BCL,大多数代码都会在本地字段前加上下划线。

于 2010-07-09T18:16:36.373 回答
0

很简单,当有类时,对私有字段使用后缀“字段”:

 private Int32 counterField;

 public Int32 Counter
 {
     get
     {
          return this.counterField;
     }

     set
     {
           if (this.counterField != value)
           {
                this.counterField = value;
                this.OnPropertyChanged("Counter");
            }
      }

你可以同时满足这两个规则。用任何字符或匈牙利语前缀装饰你的变量是部落的。每个人都可以在 StyleCop 或 FXCop 中找到他们不喜欢的规则,但一个标准只有在每个人都使用它时才有效。自动清理代码的好处远远超过您个人对语言的“艺术”贡献。

于 2015-01-22T21:19:47.843 回答
-1

我能想到的唯一替代方案似乎可以满足这两个规则,并且我实际上已经看到在任何地方使用过类似以下内容。我自己不遵循这个约定,因为它看起来很笨拙。

public class Class1
{
    // prefix private fields with "m"
    private int mValue1;

    public int Value1
    {
        get { return mValue1; }
        set { mValue1 = value; }
    }

    private string mValue2;

    public string Value2
    {
        get { return mValue2; }
        set { mValue2 = value; }
    }

    // prefix parameters with "p"
    public bool PerformAction(int pValue1, string pValue2)
    {
        if (pValue1 > mValue1)
        {
            mValue2 = pValue2;
            return true;
        }
        else
        {
            return (mValue2 == pValue2);
        }
    }
}
于 2010-07-09T19:31:17.190 回答
-2

没有冲突。更改参数名称。

public class SomeClass
{
    private int namedField { get; set; }

    public SomeClass(int differentlyNamedField)
    {
        this.namedField = differentlyNamedField;
    }
}
于 2014-03-05T14:06:47.177 回答