C#の命名規則

C#でプログラムを作ってみるにあたり、変数とかの名前の付け方ががあるのかどうか調べてみました。今までほとんどBASICだったこともありハンガリアン記法が多かったんですが、最近はあまり使われないようですので。

目次

  1. 記法
  2. どの形式を使うのか
  3. 省略形はどうするか
  4. 複合語はどうするか
  5. 名前に使う単語の選び方
  6. 名前空間の名付け
  7. メソッドの名前
  8. プロパティの名前
  9. フィールドの名前
  10. パラメータの名前
  11. まとめ

記法

記法はいくつかあります。

ハンガリアン記法
型を表す接頭辞を付ける方法です。例えば、文字列型のNameという変数であればstrNameという感じです。
Pascal形式
各単語の頭文字を大文字にして、単語をつなげて表記する形式です。例えば、NameCardという感じです。
Camel形式
最初の単語の頭文字は小文字、その後につなげる単語の頭文字を大文字にする形式です。例えば、nameCardStockerという感じです。
Snake形式
単語をつなげるときにアンダーバーを使う方法です。例えば、name_card_stockerという感じです。

どの形式を使うのか

C#については、マイクロソフトから名前に関するガイドラインというものが出されています。このサイトによれば、

複数の単語で構成されるパブリック メンバー、型、および名前空間の名前には、常に Pascal 形式を使用してください。 パラメーター名には Camel 形式を使用してください。

となっていますので、パラメータはCamel形式、それ以外は全部Pascal形式と考えれば良いようです。

省略形はどうするか

HTML (Hyper Text Markup Language)のような、各単語の頭文字をとって省略形にした単語は一般的には全て大文字で表しますが、ガイドラインではちょっと違います。

Camel 形式の識別子の先頭の単語を除き、2 文字から成る頭字語の文字は共に大文字にしてください。 Camel 形式の識別子の先頭の単語を除き、3 文字以上の文字から成る頭字語では、先頭の文字のみを大文字にしてください。 Camel 形式では、識別子の先頭にある頭字語の文字は、その文字数とは関係なく、一切大文字にはしないでください。

つまり、下表のようになります。

Pascal形式 Camel形式  
IOChannel ioChannel 最初の単語が2文字の場合
XmlWriter xmlWriter 最初の単語が3文字以上の場合

複合語はどうするか

複合語の場合は、一つの単語とみなすようです。例えばハッシュテーブルは、Pascal形式ではHashtableです。複合語かどうかは辞書を引けとのこと。

名前に使う単語の選び方

名前の長さを短くするよりも、わかりやすい名前にすることを優先します。これは慣れるしかないのかもしれません。例えば、名前にコントロール名を含める場合でも、コントロール名を省略しないようにします。OnBtnClickではなくてOnButtonClickにします。

名前空間の名付け

名前空間の名付けについては、企業名、製品名、技術名をドットでつなげるようにします。例えば、Microsoft.WindowsMobile.DirexcXです。ガイドラインに下記のように書いてあります。

名前空間名には、プリフィックスとして企業名を付け、各企業の名前空間の名前とプリフィックスが重複しないようにしてください。 名前空間の第 2 レベルには、バージョンに依存しない、安定した製品名を使用してください。 企業内のグループ名は変更されることが多いため、名前空間の階層構造での命名基準として組織の階層構造を使用することは避けてください。 Microsoft.Office.PowerPoint のように Pascal 形式を使用し、名前空間の構成要素をピリオドで区切ってください。 ブランド名で通常とは異なる形で大文字と小文字を混在させている場合は、ブランド名の形式に従い、標準の名前空間の形式から外れてもかまいません。

わかりやすくするようにしつつ、重複が起きないようにするという配慮なのですが、個人の場合は企業名どうしてるんでしょうか。

メソッドの名前

メソッド名には、動詞または動詞句を割り当ててください。

何をするものかをわかりやすくするために、動詞を付けるわけですね。

プロパティの名前

プロパティの名前には、名詞、名詞句、または形容詞を使用してください。 ブール型のプロパティの名前には、肯定的なフレーズ (CantSeek ではなく CanSeek など) を使用してください。 ブール型のプロパティには、Is、Can、Has などのプリフィックスを付けることもできますが、これは有益な場合に限定してください。

フィールドの名前

フィールド名には Pascal 形式を使用してください。 フィールドの名前には、名詞や名詞句を使用してください。 フィールド名にはプリフィックスを使用しないでください。 たとえば、静的フィールドと非静的フィールドを区別するために、g_ や s_ を使用しないでください。

パラメータの名前

パラメーター名には Camel 形式を使用します。 パラメーター名には説明的な名前を使用します。 パラメーターの型に基づいた名前ではなく、パラメーターの意味に基づいた名前を使用してください。

もう、名前を見ただけで何に使われるものかわかるようにしろということですね。

まとめ

簡単に言うと、「パラメータだけCamel形式、他は全部Pascal形式、短縮するよりわかりやすさを優先する」です。もうハンガリアン記法は使わないのですね。型と表記を分離するという思想であれば、定数についても全部大文字ではなくてPascal形式にするのが正しそうです。誰かと協業するわけでもなく個人のツール作成に使うものなので、どうでも良いといえばどうでも良いのですが、合わせていこうと思います。

広告

C#カテゴリの投稿

  • C#でMVVMって何でしょう

    C#の本や解説サイトを見ていると、C#のWPFプログラムはMVVMというパターンで作るのが作法のようなことが書いてあったりします。本投稿は、MVVMって何だ?というメモです。

  • C#でアプリのログを記録してみる

    アプリケーションの実行時にログをとっておきたいことありますよね。テキストファイルに実行時の情報を記録するようにしてみたいと思います。

  • C#でアプリの設定を保存する

    アプリの設定を保存する方法はいくつかありますが、レジストリやiniファイルはあまり使いたくないので、アプリケーション構成ファイルを使ってみたいと思います。 試した環境は下記です。OSのバージョンによって、ファイルの保存フォルダが変わったりします。

  • C#でインスタンスをプログラムで作ってみた(Activator.CreateInstance編)

    C#で自前クラスのインスタンスを動的生成してみました。 試した環境は下記です。

  • C#でインスタンスをプログラムで作ってみた(Type.InvokeMember編)

    C#で自前クラスのインスタンスを動的生成してみました。 試した環境は下記です。

  • C#でインスタンス間のデータの受け渡しをしてみた

    .Netになる前のVisual BasicでWindowsのプログラミングに入ったので、複数のプロシージャで変数を共有しようと思ったら迷わずグローバル変数を使ってました。カウンタ用の変数以外は全部グローバルみたいな。プログラミングを生業にしていたわけでもないし(今でも)、大きなデータを扱うこともなかったので、特にそれで問題ありませんでした。 で、C#でも同じノリでグローバル変数を使おうと思ったのですが、グローバル変数って無いんですね。「いつどのインスタンスがデータを書き換えるかわからない」と言われれば、確かに使わない方が良さそうですが。 というわけで、インスタンス間でのデータの受け渡しをちょっとまじめに勉強しなくてはならないかなと思いました。というメモです。

  • C#でウェブサイトのソースを取得してみた

    C#でウェブサイトのソースを取得してみました。表形式でデータを公開しているサイトから、データを自動的に抜き出したいのです。こういう作業をスクレイピングと言うそうです。Visual Studio 2015なのでHttpClientクラスが使えるのですが、非同期の処理がどうしてもうまくいかなくて、代わりにWebClientクラスを使用します。

  • C#でエラーの処理をする

    Visual Basic 2.0の頃は、エラーになる状況を予測してその状況に陥ったかどうかを判定して対処するようなコードを含むプログラムを作っていました。昨今では、try catchステートメントという便利なものがあります。

  • C#でクラスのフィールド宣言とコンストラクターでの初期化はどっちが優先する?

    C#では、クラスからインスタンスを生成したときに自動的に呼び出されるコンストラクターというメソッドがあります。インスタンス生成時に自動的に呼び出されるので、インスタンスの初期化に使われます。では、フィールドの宣言と同時に初期値を設定しつつ、コンストラクターでもそのフィールドの初期値を設定した場合には、どちらが優先するのでしょうか。

  • C#でスタックを使って逆ポーランド記法の計算をしてみた

    逆ポーランド記法で書かれた数式を、スタックを使って計算してみました。中置記法を逆ポーランド記法に変換したのは、数式を文字列で入力して計算したかったからです。

  • C#で数式を中置記法から後置記法(逆ポーランド記法)に変換してみた(三角関数編)

    以前投稿した「C#で数式を中置記法から後置記法(逆ポーランド記法)に変換してみた」では、四則演算と括弧だけの数式を対象にしていました。実際には三角関数を利用する機会がありますので、三角関数に対応させてみます。

  • C#で選択(switch-case編)

    プログラムを条件分岐する際には、if文の他にも、switch文があります。 式の値がパターンに一致するかどうか評価して、一致する場合はその実行内容を実行します。

  • C#のWPFでデータバインディング

    WPFのC#アプリケーションを久しぶりに作ろうとしたら、XAMLでのデータバインディングをすっかり忘れてしまっていたので、メモっておきます。 試した環境は下記です。

  • C#のXAMLでメニューとステータスバーのレイアウトをしてみた

    WPF(XAML)アプリにメニューを付けようとしたら、Windows Formsとは作り方が違うのでびっくりしました。というわけで、WPFでのメニューとステータスバーのレイアウトについて、メモります。

  • C#のアプリの情報を表示してみた

    C#のアプリでバージョン情報などを表示したいときに、コード内にバージョン番号をテキストとして記入していると管理が大変ですね。Visual Studioにはアプリのバージョン情報を規定する機能がありますので、そこから情報を取り出してアプリで表示してみました。 試した環境は下記です。

  • C#のクラスとインスタンスとオブジェクト

    「クラスってサブルーチンみたいなもの?」みたいな感覚のままC#で色々作ってみようとして調べてたら、やっぱりクラスについてちょっと勉強しないとダメな感じがしてきましたので、メモっておきます。

  • C#の反復処理(foreach編)

    久しぶりにC#のプログラムを書いてみたらforeachの構文を忘れていたので改めてメモっておきます。 試した環境は下記です。

  • C#の命名規則

    C#でプログラムを作ってみるにあたり、変数とかの名前の付け方ががあるのかどうか調べてみました。今までほとんどBASICだったこともありハンガリアン記法が多かったんですが、最近はあまり使われないようですので。

  • C#へのMicrosoft.TeamFoundation.Controlsの参照の追加について

    Microsoft.TeamFoundation.Controlsを使うのには注意が要るようですので、メモっておきます。といいますか、私は使うのをあきらめました。