web-dev-qa-db-ja.com

命名規則-C ++およびC#変数のアンダースコア

クラスフィールドに_var変数名が表示されるのは一般的です。アンダースコアはどういう意味ですか?これらすべての特別な命名規則のリファレンスはありますか?

125
Stan

アンダースコアは単なる規則です。これ以上何もない。そのため、その使用は常に各人によって多少異なります。問題の2つの言語でこれらをどのように理解するかを以下に示します。

C++では、通常、アンダースコアはプライベートメンバー変数を示します。

C#では、通常、パブリックプロパティの基になるプライベートメンバー変数を定義するときにのみ使用されます。他のプライベートメンバー変数にはアンダースコアがありません。しかし、この使用法は、自動プロパティの出現により、ほとんど道に迷いました。

前:

private string _name;
public string Name
{
    get { return this._name; }
    set { this._name = value; }
}

後:

public string Name { get; set; }
105
jdmichal

C++で変数名またはパラメーター名の前にUNDERSCORESを使用しないでください!!!

アンダースコアまたは二重アンダースコアで始まる名前は、C++実装者用に予約されています。アンダースコア付きの名前は、ライブラリが機能するために予約されています。

C++コーディング標準を読んでいる場合、最初のページで次のように表示されます。

「ネーミングを過剰に規定するのではなく、一貫した命名規則を使用してください。2つの必須操作のみがあります。 (p2、C++コーディング標準、ハーブサッター、アンドレイアレクサンドレスク)

また、このようなアンダースコアの使用がソフトウェア開発の際に悲惨なものになり得る理由を、あなた自身で理解することができます。

次のような単純なhelloWorld.cppプログラムをコンパイルしてみてください。

g++ -E helloWorld.cpp

あなたはバックグラウンドで起こるすべてを見るでしょう。以下がスニペットです。

   ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
   try
     {
       __streambuf_type* __sb = this->rdbuf();
       if (__sb)
  {
    if (__sb->pubsync() == -1)
      __err |= ios_base::badbit;
    else
      __ret = 0;
  }

二重アンダースコアで始まる名前の数を確認できます!

また、仮想メンバー関数を見ると、* _ vptrは、クラスで1つ以上の仮想メンバー関数を使用すると自動的に作成される仮想テーブル用に生成されたポインターであることがわかります。しかし、それは別の話です...

アンダースコアを使用すると、競合の問題が発生する可能性があり、手遅れになるまでIDEAの原因を特定できません。

66

実際、_var規則は、C#やC++ではなくVBに由来します(m _、...は別のものです)。

これは、プロパティを宣言するときのVBの大文字と小文字の区別を克服するようになりました

たとえば、userUserを同じ識別子とみなすため、VBではこのようなコードは使用できません

Private user As String

Public Property User As String
  Get
    Return user
  End Get
  Set(ByVal Value As String)
    user = value
  End Set
End Property

この問題を克服するために、一部の人は慣例に従って '_'をプライベートフィールドに追加して次のようにしました。

Private _user As String

Public Property User As String
  Get
    Return _user
  End Get
  Set(ByVal Value As String)
    _user = value
  End Set
End Property

多くの規則は.Net向けであり、C#とVB.NETの規則をある程度統一するために、同じ規則を使用しています。

私が言っていたことの参照を見つけました: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices

アンダースコアの付いたキャメルケース。 VB.NETでは、常に「Protected」または「Private」を示し、「Dim」を使用しないでください。 "m_"の使用はお勧めできません。特に、コンプライアンスに違反する保護された変数では、大文字と小文字が異なるプロパティとは異なり、VB.NETでプログラムを作成する場合は、あなたの人生が苦痛になります。メンバーにアクセサー/ミューテータープロパティとは異なる名前を付ける必要があります。ここにあるすべての項目のうち、先頭のアンダースコアは、実際に唯一の論争の的となっています。個人的には、変数名を「this」で修飾する必要がないように、プライベート変数の場合はアンダースコアなしのキャメルケースよりも個人的に好みます。コンストラクターや、名前の衝突が発生する可能性がある他の場所のパラメーターと区別するため。 VB.NETでは大文字と小文字が区別されないため、アクセサプロパティは通常、アンダースコアを除いてプライベートメンバー変数と同じ名前になるため、これはさらに重要です。 m_に関する限り、それは本当に美学に関するものです。変数名に穴があるように見えるので、私(および他の多くの人)はm_ uglyを見つけます。それはほとんど不快です。私は常にVB6でこれを使用していましたが、それは変数に先頭のアンダースコアを付けることができないためでした。私はそれが消えるのを見ることができなかった。マイクロソフトは、コードで両方を行ったとしても、m_(およびストレート_)に反対することを推奨しています。また、まっすぐな「m」を前に付けることもできます。もちろん、これらは主にC#でコーディングされるため、プロパティとは大文字と小文字が異なるだけのプライベートメンバーを持つことができます。 VB人々は何か他のことをしなければなりません。言語ごとの特殊なケースを試してみるのではなく、それをサポートするすべての言語の先頭に下線を付けることをお勧めします。クラスを完全にCLSに準拠させたい場合は、C#で保護されたメンバー変数のプレフィックスを省略できます。ただし、実際には、潜在的に保護されているすべてのメンバー変数をプライベートに保ち、代わりに保護されたアクセサーとミューテーターを提供するため、これについて心配することはありません。理由:簡単に言うと、この規則はシンプル(1文字)で読みやすく(他の主要な文字に目がそらされない)、プロシージャレベルの変数とクラスレベルのプロパティとの名前の衝突をうまく回避します。 。

41
Zied

最初のコメンター(R Samuel Klatchko)は以下を参照しました: C++識別子でアンダースコアを使用する際の規則は何ですか? C++でアンダースコアに関する質問に答えます。一般に、コンパイラの実装者のために予約されているため、先頭にアンダースコアを使用することは想定されていません。 _varで表示されるコードは、おそらくレガシーコードか、主要なアンダースコアに眉をひそめなかった古いネーミングシステムを使用して育った誰かが書いたコードです。

他の回答が述べているように、これはクラスメンバー変数を識別するためにC++で使用されていました。ただし、デコレータまたは構文に関する限り、特別な意味はありません。したがって、使用する場合はコンパイルされます。

C#のディスカッションは他の人に任せます。

5
bsruth

_varには意味がなく、変数がプライベートメンバー変数であることを区別しやすくするためだけに使用されます。

C++では、_var規則を使用するのは適切ではありません。識別子の前にアンダースコアを使用する規則があるためです。 _varはグローバル識別子として予約されていますが、_Var(アンダースコア+大文字)はいつでも予約されています。これが、C++で、代わりにvar_規則を使用している人々を見る理由です。

5
5ound

独自のコーディングガイドラインを作成できます。チームの他のメンバーのために明確なドキュメントを書くだけです。

_fieldを使用すると、Intelilsenseは_を入力するだけですべてのクラス変数をフィルタリングできます。

私は通常 Brad Adams Guidelines に従いますが、アンダースコアを使用しないことをお勧めします。

4

MicrosoftのC#の命名標準では、変数とパラメーターはキャメルケースの小文字の形式IE:paramNameを使用する必要があるとされています。標準では、同じ形式に従うフィールドも必要ですが、これによりコードが不明瞭になる可能性があるため、多くのチームが明確にするためにアンダースコアプレフィックスを必要としますIE:_fieldName

2
ChaosPandion

C#では、Microsoft Framework Design Guidelines は、publicメンバーにアンダースコア文字を使用しないことを提案します。 privateメンバーの場合、アンダースコアを使用しても問題ありません。実際、 Jeffrey Richter (ガイドラインでよく引用される)は、たとえばm_を使用し、プライベート静的メンバーには "s_"を使用します。

個人的には、プライベートメンバーをマークするために_だけを使用しています。 .NETで眉をひそめているだけでなく、非常に冗長になる可能性のあるハンガリー語表記に「m_」および「s_」が迫っています。 。

2
P.Brian.Mackey

クラスのメンバー変数には_varネーミングを使用します。私が行う主な理由は2つあります。

1)後でコードを読むときに、クラス変数とローカル関数変数を追跡するのに役立ちます。

2)クラス変数を探しているときに、Intellisense(または他のコード補完システム)で役立ちます。最初の文字を知っているだけで、利用可能な変数とメソッドのリストをフィルタリングするのに役立ちます。

1
A.J.

CおよびC++言語に関する限り、名前の下線には特別な意味はありません(開始、中間、終了)。有効な変数名文字です。 「慣習」は、コーディングコミュニティ内のコーディング慣行に由来します。

上記のさまざまな例で既に示されているように、最初の_は、C++のクラスのプライベートまたは保護されたメンバーを意味する場合があります。

おもしろい雑学かもしれない歴史をいくつか挙げてみましょう。 UNIXでは、コアCライブラリ関数とカーネルバックエンドがあり、カーネル関数をユーザー空間に公開する場合、_は、何もせずにカーネル関数を直接呼び出す関数スタブの前にスタックします。最も有名でおなじみの例は、BSDおよびSysVタイプのカーネルでのexit()対_exit()です。そこで、exit()はカーネルのex​​itサービスを呼び出す前にユーザー空間の処理を行いますが、_exitはカーネルのex​​itサービスにマップします。

したがって、_はローカルなものに使用されました。この場合、ローカルはマシンローカルです。通常、_functions()は移植性がありませんでした。その点で、さまざまなプラットフォームで同じ動作を期待しないでください。

ここで、変数名の_については、

int _foo;

心理的には、_は最初に入力しなければならない奇妙なものです。したがって、何か他のものと衝突する可能性が低い変数名を作成する場合は、特にプリプロセッサの置換を処理するときに、_の使用を検討してください。

私の基本的なアドバイスは、コーディングコミュニティの慣習に常に従って、より効率的にコラボレーションできるようにすることです。

1
Elf King

C#:で使用する完全に正当な理由があります コードがVB.NETからも拡張可能でなければならない場合。 (そうでなければ、私はしません。)

VB.NETは大文字と小文字を区別しないため、このコードで保護されたfieldメンバーにアクセスする簡単な方法はありません。

public class CSharpClass
{
    protected int field;
    public int Field { get { return field; } }
}

例えば。これは、フィールドではなくプロパティゲッターにアクセスします。

Public Class VBClass
    Inherits CSharpClass

    Function Test() As Integer
        Return Field
    End Function

End Class

ええと、fieldを小文字で書くことすらできません-VS 2010はそれを修正し続けるだけです。

VB.NETの派生クラスから簡単にアクセスできるようにするには、別の命名規則を考え出す必要があります。アンダースコアを前に付けることは、おそらく最も邪魔にならず、最も「歴史的に受け入れられる」ものです。

0
Andras Vass

特定の単一の命名規則はありませんが、私はプライベートメンバについてそれを見てきました。

0
Cade Roux

私の経験から(確かに限られていますが)、アンダースコアはそれがプライベートメンバー変数であることを示します。ただし、Gollumが言ったように、これはチームに依存します。

0
Smashery

多くの人々はプライベートフィールドにアンダースコアを付けたいと思っています。これは単なる命名規則です。

C#の「公式」命名規則は、プライベートフィールドの単純な小文字の名前(アンダースコアなし)を規定しています。

アンダースコアは非常に広く使用されていますが、私はC++の標準的な規則を知りません。

0
Mau

クラスのメンバーまたは他の種類の変数(パラメーター、関数のローカルなど)を操作しているときに明確にするために、一部のプログラマーが使用する規則です。メンバー変数にも広く使用されているもう1つの規則は、名前の前に「m_」を付けることです。

とにかく、これらは単なる慣習であり、それらすべてについて単一のソースを見つけることはできません。それらはスタイルの問題であり、各プログラミングチーム、プロジェクト、または会社には独自のものがあります(またはまったくありません)。

0
goedson

これで、this.foobarbazのように「this」を使用する表記は、C#クラスのメンバー変数に受け入れられます。古い「m_」または単なる「__」表記を置き換えます。何が参照されているかは間違いないので、コードが読みやすくなります。

0
ddm