컴파일 타임에 nameof ()가 평가됩니까?
C # 6에서는 nameof()
연산자를 사용하여 변수 또는 유형의 이름이 포함 된 문자열을 얻을 수 있습니다 .
이것은 컴파일 타임 또는 일부 Roslyn API를 통해 런타임에 평가됩니까?
예. 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)
You will notice that declaring the firstname string and using the nameof
operator generates the same code in MSIL, which means nameof
is as efficient as declaring a string variable.
참고URL : https://stackoverflow.com/questions/26573102/is-nameof-evaluated-at-compile-time
'Programming' 카테고리의 다른 글
자연어 처리를위한 Java 또는 Python (0) | 2020.07.27 |
---|---|
파이썬을 사용하여 배열에서 특정 요소를 제거하는 방법 (0) | 2020.07.27 |
data.table에서 : =를 사용하여 여러 열을 그룹별로 지정 (0) | 2020.07.27 |
Scikit의 임의 상태 (의사 난수)“malloc_error_break에서 중단 점을 설정하여 디버깅하는 방법” (0) | 2020.07.27 |
RelativeLayout이 LinearLayout보다 비쌉니까? (0) | 2020.07.27 |