C#で使用できる型は、クラス、インターフェイス、構造体、列挙型、組み込み型の5種類だ。
このセクションでは、組み込み型を除く、4種類の型とジェネリックの型パラメータの命名ガイドラインを説明する。
✓クラスの名前には名詞を使おう。
✖ クラス名に接頭辞(「Cー」など)を使用してはならない。
✓ 派生クラスの名前を基本クラスの名前で終了することを検討しよう。
このガイドラインは両者の関係を明確にし、コードを読みやすくする。
たとえば、ArgumentOutOfRangeException(基本クラスは Exception)、SerializableAttribute(基本クラスは
Attribute)などはこのガイドラインに従っている。
ただし、このガイドラインは適用しない方が読みやすいこともあるので適切に判断しよう。たとえば、Button クラスは Control
クラスの一種だが、Control という名前は含まれない。
✓.NET Framework の型から派生するクラス(またはインターフェイス)に名前を付けるときは、次のガイドラインに従おう。
|
基本データ型 |
型の派生と実装ガイドライン |
|---|---|
|
System.Attribute |
✓派生属性クラスの名前に接尾辞「ーAttribute」を追加しよう。 |
|
System.Delegate |
✓イベントとして使用されるデリゲートの名前に接尾辞「ーEventHandler」を追加しよう。 ✓イベント以外として使用されるデリゲートの名前に接尾辞「ーCallback」を追加しよう。 ✖ デリゲートに接尾辞「ーDelegate」を追加してはならない。 |
|
System.EventArgs |
✓ 接尾辞「ーEventArgs」を追加しよう。 |
|
System.Enum |
✖ このクラス(System.Enum)を派生してはならない。代わりに enum キーワードを使おう。 ✖ 接尾辞「ーEnum」または「ーFlag」を追加してはならない。 |
|
System.Exception |
✓ 接尾辞「ーException」を追加しよう。 |
|
IDictionary |
✓ 接尾辞「ーDictionary」を追加しよう。 なお IDictionary は、コレクションの型だが、下記のガイドラインよりも優先する。 |
|
IEnumerable |
✓ 接尾辞「ーCollection」を追加しよう。 |
|
System.IO.Stream |
✓ 接尾辞「ーStream」を追加しよう。 |
|
CodeAccessPermission |
✓ 接尾辞「ーAccess」を追加しよう。 |
✓ インターフェイスの名前には形容詞、または場合によって名詞を使おう。
✓ インターフェイス名には、その型がインターフェイスであることを示すために、接頭辞「Iー」を付けよう。
たとえば、 IComponent(わかりやすい名詞) 、ICustomAttributeProvider(名詞句)、および
IPersistable(形容詞)は適切なインターフェイス名だ。
✖ 構造体を使用してはならない。
山﨑:このガイドラインは、マイクロソフト公式のガイドラインから逸脱している。
構造体(値型)をクラス(参照型)と併用すると判断が難しい検討課題が生じる。それはガイドラインと実装を複雑化させる。
構造体の使用による主なメリットはメモリの使用効率とパフォーマンスだが、クラスを構造体に変えることでそれらが劇的に改善するケースはほとんどない。
(メモリの使用効率やパフォーマンスといった技術課題は、もっと高レベルなプログラムレイヤーで解決するべきだ)
列挙型の名前は PascalCase を使用する。 また、列挙型には下記の追加ガイドラインがある。
✓ビットフィールドを持たない列挙型の場合、単数形の型名を使おう。
✓ビットフィールドを持つ列挙型の場合、複数形の型名を使おう。
✖ 列挙型の型名に接尾辞「ーEnum」、「ーFlag」、「ーFlags」を追加してはならない。
✖ 列挙型の型名に接頭辞を追加してはならない。
ジェネリックは .NET Framework 2.0 に追加された。
この機能追加の結果、型パラメータと呼ばれる新しい種類の識別子が導入されることになった。
✓ 1文字の名前がそのパラメータを完全に説明し、説明的な名前によって付加価値が付かない場合を除き、ジェネリック型パラメータには説明的な名前を付けよう。
✓ 1文字の型パラメータ名を採用する場合は、接頭辞「Tー」を使おう。
✓ 単なる T
ではなく、わかりやすい型パラメーター名の前に接頭辞「Tー」を付けよう。
たとえば、TSession のような名前を付けよう。
✓ 型パラメーター名に制約を示す名前を採用することを検討しよう。
たとえば、パラメーターに ISession 制約がある場合、型パラメータ名を TSession とする。