개발공부/C#

[Effective C#] 아이템 6 : nameof() 연산자를 적극 활용하라

개발자 찐빵이 2021. 11. 21. 22:01
728x90

nameof() 란?

임의의 기호(형식, 멤버, 변수 등)의 이름에 해당하는 문자열을 돌려주는 연산자.
심볼의 이름을 평가하며 타입, 변수, 인터페이스, 네임스페이스에 대해 사용할 수 있다.
완전히 정규화된 이름, 정규화되지 않은 이름 모두 제한 없이 사용할 수 있다.

다만, 제네릭 타입을 사용할 때는 부분적으로 제작이 있어 모든 타입 매개 변수를 지정한 닫힌 제네릭 타입만 사용할 수 있다.

제네릭 타입

  • 열린 타입 : 아직 결정되지 않은 타입 파라미터가 존재. (ex. Dictionary<Tkey, Tvalue>)
  • 닫힌 타입 : 모든 파라미터가 정해진 경우. (ex. Dictionary <string, int>)

장점

Visual Studio에서 기호 참조를 이해할 수 있기 때문에, 해당 기호의 이름을 바꾸면 그에 대한 모든 참조의 이름도 바뀐다. (이름 바꾸기 작업을 할 때 실수를 줄일 수 있다.)

단점

라이브러리 사용에 대한 추가 비용이 발생한다.
타입 정보를 손실한다.

일반적인 활용 예시

INotifyPropertyChanged

public string Name
{
    get{ return name; }
    set
    {
        if (value != name)
        {
            name = value;
            PropertyChanged?.Invoke(this,
            new PropertyChangedEventArgs(nameof(Name)));
        }
    }
}

예외 타입

public static void ExceptionMessage(object thisCantBeNull)
{
    if (thisCantBeNull == null)
        throw new ArgumentNullException(nameof(thisCantBeNull),
                "We told you this can't be null");
}

Exception 타입의 생성자는 2개의 문자열을 취하기 때문에 매개변수 순서를 헷갈리기 쉬운데, 정적 분석 도구를 이용하면 매개변수에 정확히 인자의 이름을 전달했는지 확인할 수 있다.

어트리뷰트의 매개변수로 문자열을 전달해야 하는 경우 nameof()연산자를 사용하면, MVC 응용프로그램이나 Web API 응용프로그램 개발 시 경로를 지정할 때 유용하다.

반응형