識別子は、型 (クラス、インターフェイス、構造体、デリゲート、列挙型)、メンバー、変数、名前空間に割り当てる名前です。
この記事では、有効な C# 識別子の基本的な規則と、一貫性のあるプロフェッショナルなコードの記述に役立つ名前付け規則について説明します。
名前指定の規則
識別子を有効にするには次の規則に従う必要があります。 C# コンパイラは、次の規則に従っていない識別子に対してエラーを生成します。
- 識別子の名前は文字またはアンダースコア (
_) で始まらなければなりません。 - 識別子には、Unicode 文字、10 進数文字、Unicode 接続文字、Unicode 結合文字、Unicode 書式設定文字を含めることができます。 Unicode カテゴリの詳細については、Unicode カテゴリ データベースに関するページを参照してください。
識別子で @ プレフィックスを使用することで、C# キーワードに一致する識別子を宣言できます。
@ は識別子名の一部ではありません。 たとえば、@if の場合、if という名前の識別子が宣言されます。 このような逐語的識別子は主に、他の言語で宣言された識別子との相互運用性のために使用されます。
有効な識別子の完全な定義は、C# 言語仕様の「Identifiers」 (識別子) 記事にあります。
重要
C# 言語仕様では、文字 (Lu、Ll、Lt、Lm、Nl)、数字 (Nd)、接続 (Pc)、結合 (Mn または Mc)、書式設定 (Cf) カテゴリのみが許可されます。 その範囲外のものは全て、_を使用して自動的に置き換えられます。 これは、特定の Unicode 文字に影響する可能性があります。
名前付け規則
規則に加えて、識別子名の規則は .NET API 全体で使用されます。 これらの規則は名前の一貫性を提供しますが、コンパイラではそれらを強制しません。 プロジェクトでさまざまな規則を自由に使用できます。
慣例により、C# プログラムでは、型名、名前空間、すべてのパブリック メンバーに PascalCase が使用されます。 さらに、dotnet/docs チームは、.NET ランタイム チームのコーディング スタイルから採用された次の規則を使用します。
インターフェイス名は大文字
Iで始まります。属性型は
Attributeという単語で終わります。列挙型では、フラグ以外に単数名詞が使用され、フラグに複数名詞が使用されます。
識別子には、連続する 2 つのアンダースコア (
_) 文字を含めないでください。 これらの名前は、コンパイラによって生成される識別子用に予約されています。変数、メソッド、およびクラスにわかりやすい名前を使用します。
簡潔さを優先します。
クラス名とメソッド名には PascalCase を使用します。
method パラメーターとローカル変数には camelCase を使用します。
定数名 (フィールドとローカル定数の両方) には PascalCase を使用します。
プライベート インスタンス フィールドはアンダースコア (
_) で始まり、残りのテキストは camelCased です。静的フィールドの先頭は
s_です。 この規則は、Visual Studio の既定動作ではなく、フレームワーク設計ガイドラインの一部でもありませんが、editorconfig で構成可能です。広く知られ、受け入れられている省略形を除き、名前には省略形や頭字語を使用しないでください。
逆ドメイン名表記に従ってわかりやすい名前空間を使用します。
アセンブリの主な目的を表すアセンブリ名を選択します。
単純なループ カウンターを除き、単一文字の名前は使用しないでください。 また、C# コンストラクトの構文を記述する構文例では、多くの場合、C# 言語仕様で使用される規則に一致する次の単一文字名が使用されます。 構文の例は、規則では例外です。
- 構造体には
S、クラスにはCを使用します。 - メソッドには
Mを使用します。 - 変数には
v、パラメーターにはpを使用します。 -
rパラメーターにはrefを使用します。
- 構造体には
ヒント
大文字、プレフィックス、サフィックス、および単語の区切り記号に関する名前付け規則を適用する場合は、コード スタイルの名前付け規則を使用します。
次の例では、public とマークされた要素に関するガイダンスは、protected 要素と protected internal 要素を操作するときにも適用されます。これらはすべて外部の呼び出し元に表示されることを目的としています。
パスカル ケース
class、interface、struct、または delegate 型の名前を付ける場合は、パスカルケース ("PascalCasing") を使用します。
public class DataService
{
}
public record PhysicalAddress(
string Street,
string City,
string StateOrProvince,
string ZipCode);
public struct ValueCoordinate
{
}
public delegate void DelegateType(string message);
interface に名前を付けるときは、名前の前に I を付けるだけでなく、Pascal 形式を使用します。 これにより、それが interface であることがコンシューマーに明確に示されます。
public interface IWorkerQueue
{
}
フィールド、プロパティ、イベントなどの型の public メンバーに名前を付ける場合は、パスカル ケースを使用します。 また、すべてのメソッドとローカル関数にはパスカルケースを使用してください。
public class ExampleEvents
{
// A public field, these should be used sparingly
public bool IsValid;
// An init-only property
public IWorkerQueue WorkerQueue { get; init; }
// An event
public event Action EventProcessing;
// Method
public void StartEventProcessing()
{
// Local function
static int CountQueueItems() => WorkerQueue.Count;
// ...
}
}
位置レコードを書き込む場合は、パラメーターがレコードのパブリックプロパティであるため、パスカルケースを使用します。
public record PhysicalAddress(
string Street,
string City,
string StateOrProvince,
string ZipCode);
位置指定レコードの詳細については、「プロパティ定義の位置指定構文」を参照してください。
Camel 形式
private または internal フィールドに名前を付ける場合は、キャメル ケース ("camelCasing") を使用し、_ を使用してプレフィックスを付けます。 デリゲート型のインスタンスを含むローカル変数に名前を付ける場合は、キャメル ケースを使用します。
public class DataService
{
private IWorkerQueue _workerQueue;
}
ヒント
ステートメント補完をサポートする IDE でこれらの名前付け規則に従う C# コードを編集するときは、「_」と入力すると、オブジェクト スコープのすべてのメンバーが表示されます。
static または private である internal フィールドを使用する場合は、s_ プレフィックスを使用し、スレッド静的には t_ を使用します。
public class DataService
{
private static IWorkerQueue s_workerQueue;
[ThreadStatic]
private static TimeSpan t_timeSpan;
}
メソッド パラメーターを記述する場合は、Camel 形式を使用します。
public T SomeMethod<T>(int someNumber, bool isValid)
{
}
プライマリ コンストラクターのパラメーター
プライマリ コンストラクター パラメーターの名前を指定する方法は、宣言されている型によって異なります。
class型とstruct型の場合: キャメル ケースを使用し、他のメソッド パラメーターと一致します。public class DataService(IWorkerQueue workerQueue, ILogger logger) { public void ProcessData() { // Use the parameters directly logger.LogInformation("Processing data"); workerQueue.Enqueue("data"); } }public struct Point(double x, double y) { public double Distance => Math.Sqrt(x * x + y * y); }record型の場合: パラメーターがパブリック プロパティになるため、PascalCaseを使います。public record Person(string FirstName, string LastName); public record Address(string Street, string City, string PostalCode);
プライマリ コンストラクターの詳細については、「 プライマリ コンストラクター」を参照してください。
C# の名前付け規則の詳細については、「.NET ランタイム チームのコーディング スタイル」を参照してください。
型パラメーターの名前付けガイドライン
ジェネリック型パラメーターの型パラメーターには、次のガイドラインが適用されます。 型パラメーターは、ジェネリック型またはジェネリック メソッドの引数のプレースホルダーです。 ジェネリック型パラメーターの詳細については、C# プログラミング ガイドを参照してください。
単一文字の名前が内容を完全に説明する場合で、説明的な名前が付加価値をもたらさない場合を除き、ジェネリック型パラメーターには説明的な名前を付けてください。
public interface ISessionChannel<TSession> { /*...*/ } public delegate TOutput Converter<TInput, TOutput>(TInput from); public class List<T> { /*...*/ }1 文字の型パラメーターを持つ型の型パラメーター名として を利用することを
T。public int IComparer<T>() => 0; public delegate bool Predicate<T>(T item); public struct Nullable<T> where T : struct { /*...*/ }型パラメーターの説明的な名前には "T" という接頭辞を付けてください。
public interface ISessionChannel<TSession> { TSession Session { get; } }型パラメーターに与えられた制約をパラメーターの名前で示唆することを検討してください。 たとえば、
ISessionに制約されているパラメーターの名前をTSessionにします。
コード分析規則 CA1715 を使用して、型パラメーターの名前が適切に付けられていることを確認できます。
追加の名前付け規則
using ディレクティブが含まれていない例では、名前空間の修飾を使用します。 プロジェクトに名前空間が既定でインポートされていることがわかっている場合は、その名前空間の各名前を完全修飾する必要はありません。 次の例に示すように、修飾名が長すぎて 1 行に収まらない場合は、ドット (.) の後で改行できます。
var currentPerformanceCounterCategory = new System.Diagnostics. PerformanceCounterCategory();他のガイドラインに合わせて、Visual Studio デザイナーのツールを使用して作成されたオブジェクトの名前を変更する必要はありません。
.NET