DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

.NETの命名規則

「変数や関数にどのような名前をつけるべきか?」という.NETの命名規則について、ヘルプでは次のようなページで触れられています。

補足:オフィシャルではありませんが、中西庸文さんが「VB.NET コーディング標準」を、河端善博さんが「C#コーディング標準」を公開されています。両者は平鍋健児さんの「Javaコーディング標準(オブジェクト倶楽部バージョン)」を参考にして作られたものとのことです。「コーディング規約の会」から入手できます。

これらを読んでいただければ.NETの命名規則について理解出来ると思いますが、ここでは私なりにこれ以上はないというほど簡単に.NETの命名規則を説明させていただきます。

まず基本は、「単語で構成された、誰でも分かるような名前をつける」ということです。

さらに、プライベートフィールド、ローカル変数、パラメータにはCamel形式(識別子の最初の文字は小文字にし、後に続いて連結されている各単語の最初の文字を大文字にした形式。例:backColor)、それ以外はすべてPascal形式(識別子の最初の文字と、後に続いて連結されている各単語の最初の文字を大文字にした形式。例:BackColor)の名前を付けるようにします。

以上の規則だけ覚えていれば、ほとんどの場合問題ないでしょう。さらに詳しい規則を以下に列挙しますが(一部ヘルプからの抜粋)、詳しくは、ヘルプ等をご覧ください。なお、プリフィックスとは接頭語、サフィックスとは接尾語の意味です。

  • DLLの名前は、次のパターンに従う。
    <Company>.<Component>
    ここで、Companyは企業名、Componentはコンポーネントを表す。複数のコンポーネントを指定する場合は、ドットで区切る。
  • DLLの名前は、名前空間の名前に従うのが妥当。
  • 名前空間名は、次のパターンに従う。
    <Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]
    ここで、Productはバージョンに依存しない製品名、Technologyはテクノロジ名、Featureは機能を表す。
  • 適切な場合には、複数形の名前空間名を使用する。例えば、"System.Windows.Forms"。
  • クラス、インターフェイス、値型の名前には、名詞、名詞句、または場合によっては形容詞句をつける。
  • 派生クラスの名前は、末尾に基本クラスの名前を付けるよう考慮する。例えば、Stream、Exception、EventArgsなど。
  • インターフェイス名には、プリフィックス I を付る。
  • IDictionaryを実装する型には、サフィックス Dictionary を追加する。
  • IEnumerable、ICollection、IListを実装する型には、サフィックス Collection を追加する。
  • カスタムの属性クラスには、サフィックス Attribute を追加する。
  • イベント ハンドラ (イベントの型として使用されるデリゲート) の名前には、EventHandler というサフィックスを追加する。
  • イベント ハンドラではないデリゲートの名前には、サフィックス Callback を追加する。
  • デリゲートにサフィックス Delegate を追加しない。
  • 列挙値名にプリフィックスを使用しない。また、列挙値名に列挙型名を含めない。例えば、"Teams"という名前の列挙型の列挙値に、"TeamsAlpha"、"TeamsBeta"などの名前をつけない。
  • 列挙型にサフィックス Enum を追加しない。
  • flags 列挙体の名前にサフィックス Flags を追加しない。
  • ほとんどのEnum型には単数形の名前を使用するが、ビットフィールドであるEnum型には複数形の名前を使用する。
  • 静的フィールド名には、名詞または名詞句を使用する。
  • メソッド名には、動詞または動詞句を使用する。
  • プロパティ名には、名詞、名詞句、または形容詞を使用する。
  • ブール型のプロパティには、Is、Can、Has などのプリフィックスを付けることができる。
  • プロパティには、その型と同じ名前をつけることができる。例えば、CacheLevel という名前の列挙型がある場合、その値を返すプロパティにも CacheLevel という名前を付けることができる。
  • イベントの名前には、動詞または動詞句を使用する。
  • イベント名に前後の概念を与えるには、現在形と過去形を使用する。例えば、 Closing と Closed。
  • プレイベントやポストイベントを表すために、Before または After というプリフィックスやサフィックスを使用しない。
  • イベント ハンドラ シグネチャには、sender および e という名前の 2 つのパラメータを使用する。
  • リソースの区切り記号としてドット (".") を使用して識別子を入れ子にし、階層構造を明確する。例えば、Menus.FileMenu.Close.Text や Menus.FileMenu.Close.Color など。
  • 例外メッセージ リソース識別子は、例外の種類名と例外の短い識別子をドットで区切ったものを使用する。例えば、ArgumentException.BadEnumValue。

VB6以前の命名法を使っていた方への補足

ここからはVB6以前のプリフィックスを使った命名法に慣れ親しんだ人のための補足説明です。プリフィックス(接頭語)を使った命名規則はどこへ行ったのでしょうか?

Visual Basicでは今まで変数名にプリフィックスを付ける方法が推奨されていました。Integer型には"int"、String型には"str"、テキストボックスコントロールには"txt"、フォームには"frm"を名前の頭につける、さらにはモジュールレベル変数には"m"も付ける、という具合です。このことは「Visual Basic Coding Conventions」に明記されています。

このように識別子にプリフィックスを付ける方法は「ハンガリアン記法(Hungarian Notation)」(または「ハンガリアン命名規約」、「ハンガリアン表記法」、「ハンガリー型表記法」など)と呼ばれています。(これはMicrosoftの技術者Charles Simonyi氏が考えた方法であり、この命名法で付けられた変数名が英語らしくなく、彼がハンガリー人だったことからこのように呼ばれています)。この方法はVBだけでなく、Microsoftがさまざまな場面で長年使ってきた方法であり、特にWindowsプログラマには広く広まっています。(ここでは拡張されたハンガリアン記法も含めてハンガリアン記法とさせていただきます。)

ところが.NETでは一転してこのハンガリアン記法は使うべきではないとされています。これに関しては賛否いろいろな意見があるようですが、最終的にどのような命名規則を使用するかはご自分の都合に合わせて判断すればよいでしょう。

プロパティに関連したフィールドの命名について

最後に「プライベートなフィールドにアクセスするためのプロパティ(及びフィールド)にはどのような名前をつけるべきか?」という問題に触れておきます。例えば、プロパティ"DataSource"があり、そのプロパティによりアクセスされるプライベートなフィールドにはどのような名前をつければよいのでしょうか?実はこの問題にヘルプは答えを与えるどころか、彼らには何一つ良いアイデアがないらしいことをうかがわせる記述があるのみです。(これに関してはメールマガジン「.NETプログラミング研究」の第3号と第11号をご覧ください。)

.NET FrameworkのライブラリをReflector for .NETなどで逆アセンブルすると、このようなケースでフィールド名に"m_"や"_"プリフィックスをつけたり、頭を小文字にしてCamel形式にしているケースが多いようでした。MSDNでは、プレフィックスの使用や、大文字と小文字だけで名前を区別することを禁止しているので、これらが正しい方法であるかは分かりません。

  • 履歴:
  • 2007/9/30 .NET Framework 2.0のMSDNに従うように書き換える。
  • 2008/9/15 誤字を修正。(コメントでご指摘いただきました。)