[c# 6.0] nameof 연산자

eunjin lee·2023년 1월 9일
0

C# 9.0 프로그래밍

목록 보기
43/50

✍ nameof가 없는 샘플 코드

    static void Main(string[] args)
    {
        PrintInfo("Jane",30);
    }

    static void PrintInfo(string name, int age)
    {
        Console.WriteLine($"name : {name}, age : {age}");
    }

위의 코드에서 PrintInfo의 첫번째 인자인 name을 fullName으로 이름을 바꾸려고 하면, 식 안의 name도 컴파일 에러가 뜨면서 fullName으로 바꿀 것을 강제한다.

✍ nameof가 없을 때 발생하는 문제

    static void PrintInfo(string fullName, int age)
    {
        Console.WriteLine($"name : {fullName}, age : {age}"); //컴파일 에러
    }

그러나 출력 결과에 쓰일 리터럴은 여전히 name으로 남아있다는 문제가 있다. nameof를 쓰면 이 문제는 간단하게 해결된다.

✍ nameof 로 해결

    static void PrintInfo(string name, int age)
    {
        Console.WriteLine($"{nameof(name)} : {name}, {nameof(age)} : {age}");
    }

nameof를 쓴 상태에서 첫번째 인자의 인자를 바꾸려고 하면, 리터럴로 쓰일 name도 변경하라고 강제한다.

    static void PrintInfo(string fullName, int age)
    {
        Console.WriteLine($"{nameof(fullName)} : {fullName}, {nameof(age)} : {age}");
    }

그 결과 위와 같이 리터럴도 올바르게 변경할 수 있다.


✍ nameof의 다양한 인자 샘플 코드

    class Test
    {
        static void Main(string[] args)
        {
            Console.WriteLine(nameof(Person));
            Console.WriteLine(nameof(PrintInfo));

            Person p = new Person() { Name = "Peter", Age = 33};
            PrintInfo(p.Name, p.Age);
        }
        
        class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
        static void PrintInfo(string paramName, int paramAge)
        {
            Console.WriteLine($"{nameof(paramName)} : {paramName}, {nameof(paramAge)} : {paramAge}");
        }
    }
  • 위와 같이 nameof는 클래스명, 메소드명, 변수명 등 식별자라면 무엇이든 인자로 받을 수 있다.

🧐 reflection vs nameof
: 리플렉션은 코드가 실행돼야 이름이 구해지지만,
nameof는 컴파일러가 컴파일 시점에 문자열로 직접 치환하기 때문에 실행 시점에 부하가 없다.

0개의 댓글