nameof( ) 연산자를 적극 활용하라.



[ Content ]

# nameof( )

: C# 6.0에 추가된 개념으로, 임의의 기호(형식, 멤버, 변수 등)의 이름에 해당하는 문자열을 돌려줍니다.

: 심볼의 이름을 평가하며, 타입, 변수, 인터페이스, 네임스페이스에 대하여 사용할 수 있습니다.

: 완전히 정규화된 이름을 사용할 수도 있지만, 정규화되지 않은 이름도 제한 없이 사용할 수 있습니다.

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

. 열린 타입 (ex. Dictionary<Tkey, Tvalue>) : 아직 결정되지 않은 타입 파라미터가 존재.

. 닫힌 타입 (ex. Dircionary <string, int>) : 모든 파라미터가 정해진 경우를 말함.

: 항상 로컬 이름을 문자열로 반환합니다. 완전 정규화된 이름(ex. System.Int.MaxValue)을 사용하더라도 항상 로컬 이름(MaxValue)을 반환합니다.


# nameof( ) 연산자의 장점!

이름이나 문자열 식별자에 의존하는 간단한 라이브러리들이 많이 사용됩니다. 이러한 방식이 간편할진 몰라도 그에 준하는 추가 비용이 발생합니다. 대표적인 단점이 바로 타입 정보를 손실한다는 것입니다. 이로 인해 타입 정보를 활용한 기능을 제공하는 개발 도구의 도움을 받지 못하며, 정적 타입 언어의 주요 장점을 상실하는 문제가 있습니다.


nameof( ) 연산자를 활용하면 이러한 문제를 해결할 수 있습니다. 

해당 문자열을 직접 지정하는 것에 비해, 정적 형식 검사가 일어난다는 장점이 있습니다. 

Visual Studio에서는 기호 참조를 이해할 수 있기 때문에, 해당 기호의 이름을 바꾸면 그에 대한 모든 참조의 이름도 바뀝니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
public string Name
{
    get{ return name; }
    set
    {
        if (value != name)
        {
            name = value;
            PropertyChanged?.Invoke(this,
            new PropertyChangedEventArgs(nameof(Name)));
        }
    }
}

cs


# nameof( ) 활용

: 대부분의 예외 타입은 매개 변수의 이름 자체를 생성자의 매개 변수로 취합니다. 

 이 때, nameof( )로 활용하면 효율적으로 작성할 수 있습니다.


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

 -> 타이핑 오류를 방지할 수 있습니다.

 -> 차후 리팩토링에 유연한 구조를 만들어 줍니다. 


: 열거형 문자열 이름을 가져올 때 활용할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
public class NameOfOperation
{
    enum MyEnum { START, SECOND, THIRD, END };
 
    void WriteEnum()
    {
        Console.WriteLine(MyEnum.SECOND.ToString());
 
        Console.WriteLine(nameof(MyEnum.SECOND));
    }
}
cs

Console.WriteLine(MyEnum.Second.ToString( ));

-> .Net이 enum 값을 보유하고 런타임에 이름을 찾으면 실제 상대적으로 느립니다.

Console.WriteLine(nameof(MyEnum.Second));

-> nameof()를 사용하면 .NET은 컴파일 타임에 열거형 이름을 문자열로 바꿔줍니다.




[ Digression ]

 

  확실히 직접 문자열을 넣어 하드코딩하는 경우 잦은 실수가 발생합니다. 이러한 실수를 미연에 방지할 수 있고, 작업을 진행하다보면 이전 코드들을 리팩토링하는 과정에서 효율적으로 대체할 수 있는 것 같습니다. 프로젝트에서도 보편적으로 예외 타입을 생성할 때 nameof( )를 사용하여 해당 심볼을 출력해주고 있습니다.




참 고 : Effective C# 

    https://code.i-harness.com/ko-kr/q/1e3a41c

+ Recent posts