C# 識別子の名前付け規則と表記規則

識別子は、型 (クラス、インターフェイス、構造体、デリゲート、列挙型)、メンバー、変数、名前空間に割り当てる名前です。

名前指定の規則

有効な識別子は以下の規則に従う必要があります。 C# コンパイラは、以下の規則に従っていない識別子に対してエラーを生成します。

  • 識別子の名前は文字またはアンダースコア (_) で始まらなければなりません。
  • 識別子には、Unicode 文字、10 進数文字、Unicode 接続文字、Unicode 結合文字、Unicode 書式設定文字を含めることができます。 Unicode カテゴリの詳細については、Unicode カテゴリ データベースに関するページを参照してください。

識別子で @ プレフィックスを使用することで、C# キーワードに一致する識別子を宣言できます。 @ は識別子名の一部ではありません。 たとえば、@if の場合、if という名前の識別子が宣言されます。 このような逐語的識別子は主に、他の言語で宣言された識別子との相互運用性のために使用されます。

有効な識別子の完全な定義は、C# 言語仕様の「Identifiers」 (識別子) 記事にあります。

重要

C# 言語仕様では、文字 (Lu、Ll、Lt、Lm、Lo または Nl)、数字 (Nd)、接続 (Pc)、結合 (Mn または Mc)、書式設定 (Cf) カテゴリのみが許可されます。 これらに当てはまらないものはすべて、_ で自動的に置き換えられます。 これは、特定の Unicode 文字に影響を与える可能性があります。

名前付け規則

ルールに加えて、識別子の名前に関する規則が .NET API 全体で使用されます。 これらの規則は名前の一貫性を提供しますが、コンパイラはこれを強制しません。 プロジェクトでさまざまな規則を自由に使用できます。

慣例により、C# プログラムでは、型名、名前空間、すべてのパブリック メンバーに PascalCase が使用されます。 さらに、dotnet/docs チームは、.NET ランタイム チームのコーディング スタイルから採用された次の規則を使用します:

  • インターフェイス名は大文字 I で始まります。

  • 属性型は Attribute という単語で終わります。

  • 列挙型では、フラグ以外に単数名詞が使用され、フラグに複数名詞が使用されます。

  • 識別子には、連続する 2 つのアンダースコア (_) 文字を含めないでください。 これらの名前は、コンパイラによって生成される識別子用に予約されています。

  • 変数、メソッド、およびクラスにわかりやすい名前を使用します。

  • 簡潔さを優先します。

  • クラス名とメソッド名には PascalCase を使用します。

  • メソッド パラメーターとローカル変数にはキャメルケースを使用します。

  • 定数名 (フィールドとローカル定数の両方) には PascalCase を使用します。

  • プライベート インスタンス フィールドはアンダースコア (_) で始まり、残りのテキストはキャメルケースになります。

  • 静的フィールドの先頭は s_ です。 この規則は Visual Studio の既定の動作ではなく、フレームワーク設計ガイドラインの一部でもありませんが、editorconfig 内で構成可能です。

  • 広く知られ、受け入れられている省略形を除き、名前には省略形や頭字語を使用しないでください。

  • 逆ドメイン名表記に従ってわかりやすい名前空間を使用します。

  • アセンブリの主な目的を表すアセンブリ名を選択します。

  • 単純なループ カウンターを除き、単一文字の名前は使用しないでください。 また、C# コンストラクトの構文を説明する構文例では、多くの場合、C# 言語仕様で使用される規則に一致する次のような単一文字の名前が使用されます。 構文例は、このルールの例外です。

    • 構造体には S、クラスには C を使用します。
    • メソッドには M を使用します。
    • 変数には v、パラメーターには p を使用します。
    • ref パラメーターには r を使用します。

ヒント

コード スタイルの名前付けルールを使用して、大文字使用、プレフィックス、サフィックス、および単語の区切り文字に関する名前付け規則を適用できます。

次の例では、public とマークされた要素に関するすべてのガイダンスが、protectedprotected internal の要素の操作時にも適用されます。これらはすべて、外部の呼び出し元に表示することを意図しています。

パスカル ケース

classinterfacestruct または 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# コードを編集するときは、「_」と入力すると、オブジェクト スコープのすべてのメンバーが表示されます。

private または internal である static フィールドを使用する場合は、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)
{
}

C# の名前付け規則の詳細については、.NET ランタイム チームのコーディング スタイルを参照してください。

型パラメーターの名前付けガイドライン

ジェネリック型パラメーターの型パラメーターには、次のガイドラインが適用されます。 型パラメーターは、ジェネリック型またはジェネリック メソッドの引数用のプレースホルダーです。 ジェネリック型パラメーターの詳細については、C# プログラミング ガイドを参照してください。

  • 1 文字の名前でそれ自体を完全に説明でき、説明的な名前の意味がない場合を除き、ジェネリック型パラメーターには必ず説明的な名前を付けてください。

    public interface ISessionChannel<TSession> { /*...*/ }
    public delegate TOutput Converter<TInput, TOutput>(TInput from);
    public class List<T> { /*...*/ }
    
  • 1 文字の型パラメーターを持つ型の型パラメーター名として T を使用することを検討してください

    public int IComparer<T>() { return 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 デザイナーのツールを使用して作成されたオブジェクトの名前を変更する必要はありません。