Programming

컴파일 타임에 nameof ()가 평가됩니까?

procodes 2020. 7. 27. 08:02
반응형

컴파일 타임에 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

반응형