C#
최신 C# 기능
C# 11
C# 11 새기능
C# 11: Raw String Literal
C# 11: 문자열 내삽 복수라인
C# 11: u8 접미어
C# 11: Generic Math 지원
C# 11: Generic Attribute
C# 11: 리스트 패턴
C# 11: 파일 로컬 타입
C# 11: required modifier
C# 11: Auto-default struct
C# 11: ReadOnlySpan 패턴 매칭
C# 11: 확장된 nameof 범위
C# 11: nint, nuint
C# 11: ref 필드
C# 11: 소문자 타입명 경고
C# 11: 향상된 method group 변환
C# 10
VS 2022 설치
C# 10 global using
C# 10 File-scoped Namespace
C# 10 향상된 문자열 내삽
C# 10 향상된 람다식 유추
C# 10 struct 기능 향상
C# 10 record struct
C# 10 확장된 속성패턴
C# 10 향상된 명료한 할당
C# 10 Destructor 기능 개선
C# 9.0
C# 9 레코드 타입
C# 9 init accessor
C# 9 최상위 프로그램
C# 9 향상된 패턴 매칭
C# 9 향상된 Target Typing
C# 9 공변 리턴 타입
C# 9 Native Int 타입
C# 8.0
C# 8 디폴트 인터페이스 멤버
C# 8 패턴 매칭
C# 8 Nullable Reference Type
C# 8 인덱싱과 슬라이싱
C# 8 비동기 스트림
C# 8 using 선언
C# 8 널 병합 할당자
C# 8 구조체 읽기 전용 멤버
C# 8 기타 기능들
C# 7.0
C# 7.0 새기능
C# 7.0 패턴 매칭
C# 7.0 튜플
C# 7.0 로컬 함수
C# 7.0 out 파라미터
C# 7.0 리터럴 표현
C# 7.0 Deconstructor
C# 7.0 ref return
C# 7.0 async 리턴타입
C# 7.0 Expression-bodied
C# 7.0 throw expression
C# 6.0
C# 6.0 새기능
C# 6.0 널 조건 연산자
C# 6.0 문자열 내삽
C# 6.0 Dictionary초기자
C# 6.0 nameof 연산자
C# 6.0 using static문
C# 6.0 catch블럭 await
C# 6.0 Exception 필터
C# 6.0 자동 속성 초기자
C# 6.0 읽기전용 자동 속성
C# 6.0 Expression-bodied

C#으로 이해하는 자료구조
C# 프로그래밍 기초 실습 전자책
C# : nameof() 사용

C#에서 nameof()는 클래스명, 메서드명, 파라미터명 등을 코드 상에 문자열로 가져오기 위해 사용된다. 예들 들어, 아래 예제처럼 Order 클래스명을 사용하기 위해 nameof(Order)를 사용하면 'Order'라는 문자열을 리턴하게 된다.

그러나, C# 11 이전에는 nameof(파라미터) 표현을 메서드 앞의 Attribute에서는 사용할 수 없었는데, 만약 C# 11 이전 버전에서 아래 Attribute를 [Custom(nameof(orderId))] 와 같이 사용하면, CS0103: The name 'orderId' does not exist in the current context 라는 컴파일 에러를 발생시킨다.


예제

// C# 9

public class Order
{    
    // [Custom(nameof(orderId))]  -- 이렇게 하면 CS0103 에러 발생
    [Custom("orderId")]
    public void Process(int orderId, bool flag)
    {
        string clsName = nameof(Order);  // "Order"
        string method = nameof(Process); // "Process"
        string param1 = nameof(orderId); // "orderId"
        string param2 = nameof(flag);    // "flag"

        Debug.WriteLine($"Call {clsName}.{method}({param1}: {orderId}, {param2}: {flag})"); ;
        // 출력: Call Order.Process(orderId: 101, flag: True)
    }
}

public class CustomAttribute : Attribute {
    public CustomAttribute(string paramName) { /* ... */ }
}

class Program
{
    static void Main(string[] args)
    {
        new Order().Process(101, true);
    }
}



C# 11 : 확장된 nameof 사용 범위

C# 11 부터 메서드 앞의 Attribute에서 파라미터명에 대해 nameof() 를 사용할 수 있게 하였다. 위의 예제에서 Attribute를 [Custom(nameof(orderId))]으로 바꾸어도 더이상 컴파일 에러를 발생시키지 않는다. 또한, 제네릭 파라미터도 Attribute에서 nameof(제네릭타입명) 방식으로 사용할 수 있으며, 람다식에서도 동일한 방식으로 nameof를 사용할 수 있다.

예제

// C# 11 : Extended nameof scope

public class Order
{
    // 파라미터명에 nameof 사용
    [Custom(nameof(orderId))]  
    public void Process(int orderId, bool flag)
    {
        string className = nameof(Order);
        string methodName = nameof(Process); 
        string p1 = nameof(orderId);
        string p2 = nameof(flag);
    }

    // 제네릭 타입명에 nameof 사용
    [Custom(nameof(TName))]  
    public void Cancel<TName>() { }
}

public class CustomAttribute : Attribute
{
    public CustomAttribute(string paramName) { /* ... */ }
}



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.