web-dev-qa-db-ja.com

.NETタイプのプライベートメンバーの命名規則

通常、クラスまたは構造体内にプライベートフィールドがある場合は、キャメルキャッシングを使用します。そのため、名前が表示されている場合は確かにプライベートであることがわかりますが、同僚のC#コードの一部では、 m_ほとんどまたはときどき_、ある種の慣習があるように。

.NETの命名規則では、メンバー名にアンダースコアを使用できませんか?

そして、MSの命名規則などについて言及するときは、それらが最善の方法であると説明しますが、その背後にある理由を説明しないでください。

また、私がコードの所有者である場合、プライベートメンバーにcamelCasingを明確に使用しているため、コードに小さな変更を加える必要がある場合は、規則に従っているのではなく、規則に従います。

これは論争ですか?

33
Joan Venge

技術的には、アンダースコアは.NET規則に違反します(または、少なくとも以前は使用されていました-コメントスレッドを参照)。どの変数がメンバー変数(フィールド)であり、どの変数がローカルであるかを一目で確認できると非常に役立つと思います。アンダースコアはこれに役立ちます。また、インテリセンスのローカル変数からプライベートメンバー変数を適切に分離します。

.NETの命名規則については、次の非常に役立つページを参照してください。

http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices

そして、これはマイクロソフトの公式の推奨事項を含むページです:

https://msdn.Microsoft.com/en-us/library/ms229045%28v=vs.110%29.aspx

18
devuxer

.Netフレームワークのガイドラインでは、プライベートフィールドに関するガイダンスが提供されていないため、プライベートフィールド名に_またはm_プレフィックスを付けることができます。リフレクターでBCLを見ると、プレフィックスが最も一般的なパターンであることがわかります。

フィールドに名前を付けるためのリファレンスページは here にあります。ガイドラインでは、パブリックフィールドと保護フィールドの使用法のみを指定していることに注意してください。プライベートフィールドは対象外です。

25
JaredPar

私は通常、プライベートメンバー変数の前にアンダースコアを付けます。

コードを読み取ろうとしているときに簡単に見つけられ、Microsoftガイドラインで許可されています。

public class Something
{
    private string _someString = "";

    public string SomeString
    {
        get
        {
            return _someString;
        }
        set
        {
            // Some validation
            _someString = value;
        }
    }
}

他の人が言ったように、より重要なことは一貫性を持つことです。 m_の方法を実行するコーディング標準を持つチームに所属している場合は、反逆者になろうとせず、別の反逆者になろうとしないでください。それは他の誰にとっても物事をより困難にするだけです。

12
Justin Niessner

マイクロソフトは2つのオプションのいずれにも参加していません。 Visual Studioの場合、「refactor-> Encapsulate Field ...」を使用してフィールドをカプセル化します。

private string _myVar

そして

private string myVar

どちらもこのようなプロパティを生成します

public string MyVar
{
    get { return myVar; }
    set { myVar = value; }
}

したがって、Microsoftにとっても同じです:-)開発チームと合意に達することだけが問題なので、全員が同じアプローチを使用します。

通常、私は非常に特殊な状況を除いてプライベートフィールドを使用しません。保護されたプロパティを持つプライベートフィールドをカプセル化します。継承に優れ、より明確なIMHO。

4
Claudio Redi

BCLでも、命名規則に多くの不整合が見られます。一部のクラスには「_」、一部の「m_」、および一部のプロパティのPascalケースバージョンのみがあります。

アンダースコアは適切です 偶発的なスタックオーバーフローを防止する 。ただし、Visual Studioのより新しいバージョンではこれについて警告が表示されます。また、インテリセンスの最初に表示されるため、this.somePropertyでコードをいじったり、リスト全体を検索したりする必要がありません。

チームが1つの標準に同意している限り、それは大きな違いはありませんが、5年以上アンダースコアを使用していたので、私は個人的に別の方法に戻りたくありません。

あなたがコードベースを所有して維持している場合、私は彼らがあなたの標準を使用すると主張します。単純なリファクタリングを行わない場合は、丁寧なメールと組み合わせて、なぜそれを行ったかを確認します。

3
Chris S

MSフィールド使用ガイドライン の最後の段落を参照してください。

フィールド名または静的フィールド名に接頭辞を適用しないでください。特に、静的フィールドと非静的フィールドを区別するためにフィールド名にプレフィックスを適用しないでください。たとえば、g_またはs_接頭辞の適用は正しくありません。

2
Amir Karimi

有効な識別子名の使用を妨げる規則はありません。重要なのはconsistentであることです。私はすべてのプライベート変数に "_"を使用していますが、 "正しい方法"(たとえば、ReSharper)では、小文字で始めて宣言し、 "this"を使用してパラメーターとメンバーを区別するように思われます。

1
Otávio Décio

変数とメソッドをケース化するための最良の方法があるとは本当に信じていません。重要なのは、あなたとあなたのチームが一貫しているということです。 .NETの命名規則はMicrosoftが指定する方法としては優れていますが、他の規則を好む人もいます...

個人的な余談として、私はプライベート変数とメソッドの前に「_」を付けてから、キャメルケーシング、保護された変数とメソッド、キャメルケーシング、パブリック変数とメソッドにPascalケーシングを付けることにしましたが、それは私だけです。

1
LorenVS

はい、StyleCop(MSコーディングルールを適用)によって適用される命名規則は、プライベートインスタンスフィールドに対して「アンダースコアなし、キャメルケース」です。

定数/静的な読み取り専用フィールドには「パスカルケース」の命名規則があります(大文字で始まる必要がありますが、大文字で叫んではいけません)。

他の命名規則はC++スタイルからの引き継ぎです。これは、C#チームの出身地であるため、C#のコーディングに使用された最初のスタイルでした。

重要な注意:このコーディングスタイルを使用するかどうかは、開発チーム次第です。チームの全員が同じスタイルを使用することは、特定のスタイルを使用するよりもはるかに重要です。
OTOH、MSは多くの検討の結果、このスタイルを選択したので、タイブレーカーとして使用します。コーディングスタイルで何らかの方法をとる特別な理由がない場合は、StyleCopの方法を使用します。

1
Task

命名規則も含む設計ガイドラインに関する2つのMSDN記事( ここ および ここ )があります。残念ながら、彼らは「公に見える」ものに制限されています。非公開のものに名前を付けるためのガイドラインを提供していませんし、私が知る限り、Microsoftが非公開のものに公式の名前付けガイドラインを提供していません。

StyleCop (Microsoftツール)は、名前にアンダースコアを使用することに反対しています。開発者からアンダースコアの使用を好む2つの理由:

  • 非公開メンバーを明確にマークします(タイプ_とインテリセンスは非公開メンバーをすべて表示します)。
  • ローカル変数(キャメルケースでも記述されることが多い)、メソッドパラメータ、非パブリックフィールド間の競合を防ぎます。

IMOは両方ともアンダースコアを使用する十分な理由ですが、コードがどのように見えるようにするのが好きではないので、使用しません。可能な場合はキャメルケースのみを使用したいので、this.ローカル変数またはメソッドパラメータと競合する場合。

チームとプロジェクト内でコーディングスタイルの一貫性を保つようにするだけです。

1
stmax