C#プログラミング・コーディングルール

  • 2018年11月29日
  • 2018年12月3日
  • C#
C#

.NET Frameworkのリリースとともに、Microsoftは新たなプログラミング開発言語「C#」をリリースした。「C#」は.NETのために開発された特別なプログラミング開発言語であるが、かつての「C」や「Java」のように、いずれはクロスプラットフォームの開発言語になる要素も秘めている。(オープンソースのUnixバージョンはすでに存在する)

現在「C#」はバージョンが2.0となり、統合開発環境は「Visual Studio 2005」となった。ちなみに次期バージョンも、開発コード名 「Visual Studio “Orcas”」から正式名「Microsoft® Visual Studio® 2008」 に変更された。

ここで示すコーディングルールは、当社標準化プロジェクトにて規定した社内ルールであり、その他の技術者向けに策定したものではない。従って、本ルールを参照する技術者の方々については、それぞれの感性にてカスタマイズして適用していただきたい。

ネーミング

名前空間(ネームスペース名)
ネームスペース名は”.”で区切った文字列で定義し、基本的にはPascal形式(最初の文字と後に続く各単語の最初の文字を英大文字)を使用する。

企業名.組織名.テクノロジー名.機能名(企業名.組織名.ソリューション名.プロジェクト名)を親ネームスペース名とし、その後にサブネームスペースを付加する。
※サブネームスペースは開発するプロジェクトのモデル階層を考慮して体系化する。

CompanyName.OrganizationName.TecnologyName.FeatureName.GroupName

クラス名
クラス名は先頭文字を大文字にする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。クラス名には意味のある文字列を使用し、ネームスペース名と同一名を使用しない。クラスを明示するためのプレフィックスや単語を接続するためのアンダースコア(_)は不要。

public class Sample {
}

public class LocalFormatString {
}

例外クラス名
例外クラス名はクラス名の最後に”Exception”をつける。

public class SampleException : Exception {
}

インタフェース名
インタフェース名はクラス名の規約に準ずる。なお、クラス名と区別する必要がある場合は明示的に先頭に”I”をつける。

public interface DeviceControl {
}

public interface ISample {
}

抽象クラス名
抽象クラス名はクラス名の規約に準ずる。なお、適当な名前がない場合は明示的に”Abstract”から始まり、サブクラス名を連想させるクラス名をつける。

public abstract class AbstractWindowsDraw {
}

実装クラス名
実装クラス名はクラス名の規約に準ずる。なお、インタフェースと区別する必要がある場合は明示的にクラス名の最後に”Impl”をつける。

public class SampleImpl : ISample {
}

メソッド名
メソッド名は先頭大文字を基本とする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。メソッド名には意味のある文字列を使用する。

public void SampleMethod() {
}

ファクトリメソッド名
ファクトリメソッド(オブジェクトをnewするメソッド)名はメソッド名の先頭に”New”または”Create”をつけ、その後ろにメソッドで生成するオブジェクト名を続ける。

public Sample NewSample() {
Sample sample = new Sapmle();

}

コンバータメソッド名
コンバータメソッド(オブジェクトを別のオブジェクトへ変換するメソッド)名はメソッド名の先頭に”To”をつけ、その後ろにメソッドで変換するオブェクト名を続ける。

public LocalFormatString ToLocalFormatString() {
}

プロパティ名
プロパティ名はその戻り値の内容が判断できる名前をつける。それはデータ型をプレフィックスとして命名するという意味ではなく、そのプロパティ自身が何であるかを示す名前をつける。必要に応じて、列挙型(enum)を用いて、データ型とするのもよい。

またインスタンス変数へのアクセスのために必要以上のプロパティを作成しない。インスタンス変数は他のインスタンス変数と密接な関係がある場合が多いため、独立性の高いもののみをプロパティにする等の考慮が必要である。

private int year;
private int month;
private int date;

public int Year {
get {
return year;
}
set {
year = value;
}
}

bool変数を返却するメソッド名
bool変数を返却するメソッド名は戻り値の状態が判断できる名前をつける。メソッド名の先頭に”Is”、”Can”、”Has”等をつけ、その後ろに形容詞、動詞、名詞を続ける。

public bool IsEmpty() {
}

public bool CanDelete() {
}

public bool HasValue() {
}

変数名(インスタンス変数)
private/protected/internal/protected internalスコープのインスタンス変数名は先頭文字を小文字(Camel形式)とする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。

publicスコープのインスタンス変数名は先頭文字を大文字(Pascal形式)とする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。(public変数の多用は避ける)

bool変数の場合はその変数の状態が判断できる名前をつける。変数名の先頭に”Is”、”Can”、”Has”等をつけ、その後ろに形容詞、動詞、名詞を続ける。

private string userName;
private bool isEmpty;
private bool canDelete;
private bool hasValue;
public string CompanyName;

変数名(ローカル変数)
ローカル変数名は先頭文字を小文字(Camel形式)とする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。

string message;
bool isBusy;

定数名
定数名はすべて大文字とする。複数の単語を組み合わせて構成する場合は、各単語の間を”_”(アンダースコア)で区切る。

public const string TABLE_NAME = “CampanyInfo”;
public cont int MAX_VALUE = 100;

ループカウンタ
スコープが狭いループでは、そのループカウンタとして”i”、”j”、”k”...の文字をアルファベット順で使用する。(通常処理やスコープの広いループでは使用しない)

for (int i = 0; i < ROW_MAX; i++) {
for (int j = 0; j < COLUMN_MAX; j++) {
for (int k = 0; k < FIELD_SIZE; k++) {
・・・・・・・
}
}
}

スタイル

コメント
ファイルの先頭にコピーライト、およびシステム名等を記述する。なお「ドキュメントコメント」を使用せず、/* (コメント) */の形式を用いる。

/*
*
* Copyright (c) 2007 PRIME CO.,LTD All Rights Reserved.
*
* システム名: 賃貸管理システム
* サブシステム名: ユーザ管理
*
* 作成者: y.ikehara
* 日付: 2007/07/17
* バージョン: 1.00
* メモ:
*
* 履歴:
* 変更ID 変更日 変更者 変更理由
* —————————————————–
* A001 2007/07/17 y.ikehara 新規作成
* —————————————————–
*/

クラス、インタフェース、コンストラクタ、クラスメソッド、インスタンスメソッド、クラスフィールドおよびインスタンスフィールドのコメントでは「ドキュメントコメント」を活用する。

書式
・「///」ではじめる。
・適切なXML形式でなければならない。タグには終了タグも必要。「</XXX>」

タグ
<summary>
概要について説明を1行程度で明記する。
<remark>
機能仕様について説明を明記する。
<param>
メソッドに引数がある場合、その引数について説明を明記する。
<return>
メソッドに戻り値がある場合、その戻り値の説明を明記する。
<exception>
メソッドにが例外をスローする場合、その例外について説明を明記する。
<example>
使用方法が難解である場合、コーディングサンプルを明記する。
<value>
プロパティを実装した場合、そのプロパティの説明を明記する。

上記以外のタグもあるが、適宜、必要なものを記述する。

補足
クラス、およびメソッドの定義が始まる直前にコメント行を配置し、そのクラスの機能概要、外部インタフェースについて記述する。
詳細については「NDoc」のドキュメントを参照のこと。

改行のルール
プログラムの見やすさを考慮した場合、1行の長さを適度に制限する必要がある。基本的には80桁以内を目安とし、それを超える場合は行を分割する。行を分割するには、「,(カンマ)」の位置での改行、または演算子(複数の演算子を使用している場合は優先順位の低い演算子)の前で改行を入れる。このような考慮をするだけで、コードの可読性が高まる。

不要メソッド・変数の削除
プログラム内で使用していない変数(インスタンス変数、ローカル変数)は必ず削除する。不要な変数があると、プログラムの可読性が低くなる。同様にメソッドについても使用しないものについては実装しない。後々必要と思えるものについても、必要となったときに実装する。

フォーマット
見た目のフォーマットは非常に大切である。技術者の感性は様々であり、統一は困難であるが基本方針について記述する。
・1行の文字数を最大80桁とする。
・インデントは空白4文字分とする。その際、タブは使用せず空白文字を使用する。
・1行に複数のステートメント(式)を記述しない。(変数定義も同様に、1行1変数の宣言とする)
・不等号の向きは左向き(「<」、「<=」)にする。(定数と比較する場合は右向きでも可)
・不等号で使用する定数は右側に配置する。
・カンマの後には空白文字を入れる。
・for文の「;(セミコロン)」の後には空白文字を入れる。
・算術演算子(「+」、「-」、「*」、「/」、「%」)の前後には空白文字を入れる。
・算術演算子(「++」、「–」)とオペランドの間には空白文字を入れない。
・代入演算子(「=」、「+=」、「-=」、「*=」、「/=」、「%=」)の前後には空白文字を入れる。
・比較演算子(「<」、「<=」、「==」、「>」、「>=」、「!=」)の前後には空白文字を入れる。
・条件演算子(「||」、「&&」、「|」、「&」、「^」、「!」)の前後には空白文字を入れる。
・シフト演算子(「<<」、「>>」、「>>>」)の前後には空白文字を入れる。
・ビット演算子(「|」、「&」、「^」、「~」)の前後には空白文字を入れる。
・return文では括弧を使用しない。
(メソッドでなく式であることを明確にする)

文法の基本形
文法の書式・形式についてもフォーマットと同様、技術者の感性に依存する部分である。基本方針について記述する。
・for文で使用するカウンタはfor文のカウンタ宣言にて行なう。
(for文の外側で宣言しない)
・for文とwhile文の使用用途を明確にする。
(カウンタを利用する規則的な繰り返しの場合はfor文、それ以外はwhile文を使用する)
・for文で使用するカウンタの初期値は「0」を基本とする。
(配列の添字は「0」からである.カウンタはインデックスの役割で使用する場合が多い)
・制御文(「if」、「else」、「while」、「for」、「do while」)での「{}」は省略しない。
(1行の式でも省略しない.機能追加時のバグ発生を避けられる)
・ローカル変数は利用する直前で宣言する。
(C言語のように関数の入り口で宣言しない)

最新情報をチェックしよう!