다음을 통해 공유


C# 식별자 명명 규칙 및 관례

식별자은 형식(클래스, 인터페이스, 구조체, 대리자 또는 열거형), 멤버, 변수 또는 네임스페이스에 여러분이 부여하는 이름입니다.

명명 규칙

유효한 식별자는 다음 규칙을 따라야 합니다. C# 컴파일러는 다음 규칙을 따르지 않는 식별자에 대한 오류를 생성합니다.

  • 식별자는 문자 또는 밑줄(_)로 시작해야 합니다.
  • 식별자는 유니코드 문자 문자, 10진수 문자, 유니코드 연결 문자, 유니코드 결합 문자 또는 유니코드 서식 문자를 포함할 수 있습니다. 유니코드 범주에 대한 자세한 내용은 유니코드 범주 데이터베이스참조하세요.

식별자의 @ 접두사를 사용하여 C# 키워드와 일치하는 식별자를 선언할 수 있습니다. @ 식별자 이름의 일부가 아닙니다. 예를 들어, @ifif이라는 식별자를 선언합니다. 이러한 축자 식별자는 주로 다른 언어로 선언된 식별자와의 호환성을 위해 사용됩니다.

유효한 식별자에 대한 전체 정의는 C# 언어 사양식별자 문서를 참조하세요.

중요하다

C# 언어 사양 문자(Lu, Ll, Lt, Lm 또는 Nl), 숫자(Nd), 연결(PC), 결합(Mn 또는 Mc), 서식(Cf) 범주만 허용합니다. 그 외 모든 항목은 _을 사용하여 자동으로 대체됩니다. 이는 특정 유니코드 문자에 영향을 미칠 수 있습니다.

명명 규칙

규칙 외에도 식별자 이름에 대한 규칙이 .NET API 전체에서 사용됩니다. 이러한 규칙은 이름에 일관성을 제공하지만 컴파일러는 이를 적용하지 않습니다. 프로젝트에서 다양한 규칙을 자유롭게 사용할 수 있습니다.

규칙에 따라 C# 프로그램은 형식 이름, 네임스페이스 및 모든 공용 멤버에 PascalCase 사용합니다. 또한 dotnet/docs 팀은 .NET 런타임 팀의 코딩 스타일채택된 다음 규칙을 사용합니다.

  • 인터페이스 이름은 대문자 I시작합니다.

  • 특성 형식은 Attribute단어로 끝납니다.

  • 열거형은 플래그가 아닌 경우 단수 명사를 사용하고, 플래그인 경우 복수 명사를 사용합니다.

  • 식별자에는 두 개의 연속 밑줄(_) 문자가 포함되어서는 안 됩니다. 이러한 이름은 컴파일러에서 생성된 식별자를 위해 예약됩니다.

  • 변수, 메서드 및 클래스에 의미 있고 설명이 포함된 이름을 사용합니다.

  • 간결성보다 선명도를 선호합니다.

  • 클래스 이름 및 메서드 이름에 PascalCase를 사용합니다.

  • 메서드 매개 변수 및 지역 변수에 camelCase를 사용합니다.

  • 필드와 로컬 상수 모두의 상수 이름에 PascalCase를 사용합니다.

  • 프라이빗 인스턴스 필드는 밑줄(_)로 시작하고 나머지 텍스트는 camelCased입니다.

  • 정적 필드는 s_으로 시작합니다. 이 규칙은 기본 Visual Studio 동작이나 Framework 디자인 지침의 일부가 아니지만, editorconfig에서 구성할 수 있습니다.

  • 널리 알려지고 허용되는 약어나 두문자어를 제외하고 이름에 이를 사용하지 마십시오.

  • 역방향 도메인 이름 표기법을 따르는 의미 있고 설명이 포함된 네임스페이스를 사용합니다.

  • 어셈블리의 기본 용도를 나타내는 어셈블리 이름을 선택합니다.

  • 단순 루프 카운터를 제외하고 단일 문자 이름을 사용하지 마세요. 또한 C# 구문의 구문을 설명하는 구문 예제에서는 C# 언어 사양사용되는 규칙과 일치하는 다음 단일 문자 이름을 사용하는 경우가 많습니다. 구문 예제는 규칙에 대한 예외입니다.

    • 구조체에 S 사용하고 클래스의 경우 C 사용합니다.
    • 메서드에 M 사용합니다.
    • 변수에는 v, 매개 변수에는 p 사용합니다.
    • r을(를) ref 매개 변수에 사용합니다.

코드 스타일 명명 규칙을 사용하여 대문자, 접두사, 접미사 및 단어 구분 기호와 관련된 명명 규칙을 적용할 수 있습니다.

다음 예제에서 public 표시된 요소와 관련된 지침은 protectedprotected 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접두사를 붙이는 것 외에 파스칼 표기법을 사용하십시오. 이 접두사는 소비자에게 그것이 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);

위치 레코드에 대한 자세한 내용은 속성 정의를 위한 위치 구문을 참조하세요.

카멜 케이스

private 또는 internal 필드의 이름을 지정할 때는 카멜케이스("camelCasing")를 사용하고, _를 접두사로 붙입니다. 지역 변수의 이름을 지정할 때, 대리자 형식의 인스턴스를 포함하여 카멜 표기법을 사용합니다.

public class DataService
{
    private IWorkerQueue _workerQueue;
}

문 완성을 지원하는 IDE에서 이러한 명명 규칙을 따르는 C# 코드를 편집할 때 _ 입력하면 개체 범위 멤버가 모두 표시됩니다.

private 또는 internalstatic 필드를 사용할 때는 s_ 접두사를 사용하고, 스레드 정적을 위해서는 t_를 사용하십시오.

public class DataService
{
    private static IWorkerQueue s_workerQueue;

    [ThreadStatic]
    private static TimeSpan t_timeSpan;
}

메서드 매개변수를 작성할 때 앞 글자를 대문자로 표기하는 camelCase 방식(카멜 케이싱)을 사용합니다.

public T SomeMethod<T>(int someNumber, bool isValid)
{
}

C# 명명 규칙에 대한 자세한 내용은 .NET 런타임 팀의 코딩 스타일참조하세요.

형식 매개 변수 명명 지침

다음 지침은 제네릭 형식 매개 변수의 형식 매개 변수에 적용됩니다. 형식 매개 변수는 제네릭 형식 또는 제네릭 메서드의 인수에 대한 자리 표시자입니다. C# 프로그래밍 가이드에서 제네릭 형식 매개 변수에 대해 자세히 확인할 수 있습니다.

  • 단일 문자 이름이 완전히 설명적이라서 설명이 포함된 이름이 가치가 없다면, 제네릭 형식 매개 변수의 이름을 설명적인 이름으로 지정하십시오.

    public interface ISessionChannel<TSession> { /*...*/ }
    public delegate TOutput Converter<TInput, TOutput>(TInput from);
    public class List<T> { /*...*/ }
    
  • 형식에 단일 문자 형식 매개 변수가 있을 경우, 형식 매개 변수 이름으로 사용을 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 코드 분석 규칙을 사용하여 형식 매개 변수의 이름을 적절하게 지정할 수 있습니다.

추가 명명 규칙

  • 지시문사용하는 포함하지 않는 예제는 네임스페이스 한정을 사용합니다. 네임스페이스가 프로젝트에서 기본적으로 가져오기 설정되어 있는 경우, 해당 네임스페이스의 이름을 완전히 명시할 필요가 없습니다. 다음 예제와 같이 한 줄에 너무 길면 점(.) 다음에 정규화된 이름이 끊어질 수 있습니다.

    var currentPerformanceCounterCategory = new System.Diagnostics.
        PerformanceCounterCategory();
    
  • Visual Studio 디자이너 도구를 사용하여 만든 개체의 이름을 다른 지침에 맞게 변경할 필요가 없습니다.