C#コーディングルール

C#コーディングルール_#10_private変数にアンダーバーを付ける

Udemyで公開しているC#のコースを1つ無料でプレゼントしています。こちらから確認してください。

前回はローカルルールとは何か?というお話をしました。今回はその中の一つをご紹介します。

Private変数にアンダーバーを付けるというものです。

クラスの中でのみ参照するprivateなフィールドは変数名の頭に「アンダーバー」を付けます。

アンダーバーを付ける利点

このローカルルールの利点はコーディング中にアンダーバーを打ち込むとprivateフィールドがインテリセンスに出てきてわかりやすいというものがあります。インテリセンスとは,コーディング中に「.」ドットを付けると候補になるメソッド名等がリストされますよね。それの事です。「a」と打ち込むと「a」で始まるものや,「a」を含む変数やメソッド名がリストされますが,アンダーバーで絞り込むことで,そのクラスで自分が宣言しているprivate変数がリストされるのでわかりやすくなります。

また,「メソッド内」の変数と「クラス変数」が区別しやすいという利点もあります。

メソッド内の変数とは,なにかメソッドを作成した場合に,そのメソッドの中でのみ使用する変数の事です。メソッドを抜けるとその変数の値も消滅します。そういったメソッド内変数と,クラス全体で保持しているprivate変数とを区別するためにアンダーバーを付けます。

メソッド内にアンダーバー付きの変数があれば,この変数はクラス全体に影響するへんすうなんだなと理解しながら解析したり,コーディングしたりできます。アンダーバー付きの変数はクラス全体に影響するので,不用意に値を書き換えてはいけないという判断ができるのです。

結構主流

このローカルルールは結構主流です。私自身,いろんなプロジェクトで見たことがあるし,マイクロソフトの複数のチームでこのローカルルールは適応されているようです。

マイクロソフトの一部のチームではstaticなprivate変数も同様に区別できるように「s_」アルファベットの小文字のエスの後にアンダーバーを付けるチームもあるようです。

確かにいいアイデアだとは思いますが,少し複雑になり,チームでの統一が難しい気もするし,あまり頻繁に遭遇するケースでもないため,私のチームでは採用していません。純粋にアンダーバーのみを付けるルールは気に入って使っています。

実演

ProductEntityというクラスの中で,今解説した内容を実際にコーディングしていきます。

ProductEntityというクラスに「_productName」というprivateフィールドを作成します。

コンストラクタを作成し,その中でアンダーバーを打ち込んでみます。するとインテリセンスの中に「_productName」が表示されます。これで,このクラスのなかのprivateフィールドにはどのようなものがあるかがすぐに判るようになります。

「メソッド内の変数とクラス変数が区別できる」という例としては次のようなものになります。

最初にクラスのprivateフィールドとして「_productName」を宣言し,メソッドのGetDataの中のforeachの中で「productName」を使用しています。もし,クラスのprivateフィールドの名前がアンダーバーなしの「productName」だった場合はforeachで使う名前は別の名前にするか,もしくはprivateフィールドへのアクセスを明示的に示すために「this」が必要になります。

「this.productName = productName;」といった具合に「this」を付けないとどちらの「productName」か?をコンパイラが認識できないため,コンパイルが通りません。 アンダーバーを付けていれば,メソッド内の変数とprivateフィールドが重複することはなくなるので,わかりやすくなると私は思っています。 あと,同じ意味でよく使うケースはコンストラクタの引数の問題です。

このパターンは最もよく使います。クラスを生成するときに,クラス内のprivateフィールドに値を設定するケースです。この場合も引数と同じ名前になると,privateフィールドに「this」を付ける必要が出てくるので,私はアンダーバー始まりをお勧めしています。

Udemyで公開しているC#のコースを1つ無料でプレゼントしています。こちらから確認してください。