22

コード分​​析とStyleCopの両方がガイドラインとして意図されており、多くの人がとにかくこれらを無視することを選択したことを理解していることを前に付けます。しかし、そうは言っても、これら2つのルールに関する一般的なコンセンサスが何であるかを確認したいと思います。

ルール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にしたくありません。これは、パブリックフィールド/プロパティの(かなり普遍的な)規則だからです。そして、あいまいさを解決するためだけに、どちらか一方の名前を変更したくありません。

したがって、上記の2つのうちのいずれかが残っているため、SA/CAルールの1つを抑制する必要があります。

あなたたちは通常何をしますか?さらに重要なことに、これらのルールの作成者は、あなたが何をすべきだと考えていますか(どちらもドキュメントに代替ソリューションを提供していないため)?

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

簡単です。クラスがある場合は、プライベート フィールドに「Field」という接尾辞を使用します。

 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 に答える