C # 6에서는 nameof()
연산자를 사용하여 변수 또는 형식의 이름이 포함 된 문자열을 가져올 수 있습니다 .
이것은 컴파일 타임에 평가됩니까, 아니면 일부 Roslyn API를 통해 런타임에 평가됩니까?
C # 6에서는 nameof()
연산자를 사용하여 변수 또는 형식의 이름이 포함 된 문자열을 가져올 수 있습니다 .
이것은 컴파일 타임에 평가됩니까, 아니면 일부 Roslyn API를 통해 런타임에 평가됩니까?
답변:
예. nameof()
컴파일 타임에 평가됩니다. 최신 버전의 사양보기 :
nameof 표현식은 상수입니다. 모든 경우에 nameof (...)는 컴파일 타임 에 평가되어 문자열을 생성합니다. 인수는 런타임에 평가되지 않으며 도달 할 수없는 코드로 간주됩니다 (그러나 "도달 할 수없는 코드"경고를 표시하지 않음).
nameof 연산자 에서 -v5
이 TryRoslyn 예제 를 통해 확인할 수 있습니다 .
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
다음과 같이 컴파일 및 디 컴파일됩니다.
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
런타임에 해당하는 것은 다음과 같습니다.
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
주석에서 언급했듯이 nameof
이는 제네릭 유형의 유형 매개 변수에 사용할 때 유형 매개 변수의 이름 대신 유형 매개 변수로 사용되는 실제 동적 유형의 이름을 기대하지 않는다는 것을 의미합니다 . 그래서 이거:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
이것이 될 것입니다 :
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
컴파일 타임에 평가된다는 증거 로 @ I3arnon 이 제공 한 답변 을 풍부하게 하고 싶었 습니다.
nameof
연산자를 사용하여 콘솔에서 변수 이름을 인쇄하고 싶다고 가정 해 보겠습니다 .
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
생성 된 MSIL을 확인하면 문자열에 대한 개체 참조가 ldstr
연산자를 사용하여 스택에 푸시되기 때문에 문자열 선언과 동일하다는 것을 알 수 있습니다.
IL_0001: ldstr "Gigi"
IL_0006: stloc.0
IL_0007: ldstr "firstname"
IL_000c: stloc.1
IL_000d: ldloc.1
IL_000e: call void [mscorlib]System.Console::WriteLine(string)
firstname 문자열을 선언하고 nameof
연산자를 사용하면 MSIL에서 동일한 코드가 생성된다는 것을 알 수 있습니다. 즉 nameof
, 문자열 변수를 선언하는 것만 큼 효율적입니다.
nameof
일반 하드 코딩 된 문자열이 아니라 연산자 임을 얼마나 쉽게 인식 할 수 있습니까?