이전에는 왜 많은 예제가 var
키워드를 사용하는지 알 수 있었는데 익명 유형에만 필요하지만 그럼에도 불구하고 ‘Quicker’/ eaerier 및 ‘just reason’코드를 작성하는 데 사용된다는 대답을 얻었습니다.
다음은 이 링크 ( “C # 3.0 – 바르하지 Objec”) I 톱 var
일리노이에서 올바른 형식으로 아래로 컴파일됩니다 (당신은 기사 아래 중간에 대해 그것을 볼 것).
내 질문은 var
키워드를 사용하는 IL 코드가 얼마나 많이 사용하는지 , 그리고 코드가 어디서나 사용된다면 코드의 성능에 대해 측정 가능한 수준에 가깝습니까?
답변
var
키워드에 대한 추가 IL 코드가 없습니다 . 결과 IL은 익명이 아닌 유형에 대해 동일해야합니다. 컴파일러에서 사용하려는 유형을 파악할 수 없어서 IL을 작성할 수없는 경우 컴파일러 오류가 발생합니다.
유일한 트릭은 var
유형을 수동으로 설정하려는 경우 인터페이스 또는 상위 유형을 선택한 정확한 유형을 유추하는 것입니다.
8 년 후 업데이트
이해가 변경됨에 따라 이것을 업데이트해야합니다. var
메서드가 인터페이스를 반환하는 상황에서 성능에 영향을 줄 수 있다고 생각 하지만 정확한 유형을 사용했을 것입니다. 예를 들어,이 방법이 있다면 :
IList<int> Foo()
{
return Enumerable.Range(0,10).ToList();
}
메소드를 호출하려면 다음 세 줄의 코드를 고려하십시오.
List<int> bar1 = Foo();
IList<int> bar = Foo();
var bar3 = Foo();
세 가지 모두 예상대로 컴파일 및 실행됩니다. 그러나 처음 두 줄은 정확히 같지 않으며 세 번째 줄은 첫 번째 줄이 아니라 두 번째 줄과 일치합니다. 의 서명은 Foo()
을 반환하는 IList<int>
것이므로 컴파일러가 bar3
변수를 작성 하는 방법 입니다.
성능 관점에서는 대부분 눈치 채지 못할 것입니다. 그러나 세 번째 라인의 성능이 첫 번째 라인의 성능만큼 빠르지 않은 상황이 있습니다 . bar3
변수 를 계속 사용하면 컴파일러가 같은 방식으로 메서드 호출을 전달하지 못할 수 있습니다.
지터가이 차이를 지울 수는 있지만 가능하지는 않습니다. 일반적으로 var
성능 측면에서 여전히 비 인수자로 간주해야 합니다. dynamic
변수를 사용하는 것과는 전혀 다릅니다. 그러나 결코 변화를 일으키지 않는다고 말하면 과장된 것일 수 있습니다.
답변
Joel이 말했듯이 컴파일러는 var 유형이 무엇인지 컴파일 타임에 해결 합니다. 실제로 키 입력을 저장하기 위해 컴파일러가 수행하는 트릭입니다. 예를 들어
var s = "hi";
로 대체되다
string s = "hi";
IL이 생성되기 전에 컴파일러에 의해 생성 된 IL은 문자열을 입력 한 것과 정확히 동일합니다.
답변
아무도 아직 반사판을 언급하지 않았 듯이 …
다음 C # 코드를 컴파일하는 경우 :
static void Main(string[] args)
{
var x = "hello";
string y = "hello again!";
Console.WriteLine(x);
Console.WriteLine(y);
}
그런 다음 반사기를 사용하면 다음과 같은 이점이 있습니다.
// Methods
private static void Main(string[] args)
{
string x = "hello";
string y = "hello again!";
Console.WriteLine(x);
Console.WriteLine(y);
}
따라서 런타임 성능에 전혀 영향을 미치지 않습니다.
답변
다음 방법의 경우 :
private static void StringVsVarILOutput()
{
var string1 = new String(new char[9]);
string string2 = new String(new char[9]);
}
IL 출력은 다음과 같습니다.
{
.method private hidebysig static void StringVsVarILOutput() cil managed
// Code size 28 (0x1c)
.maxstack 2
.locals init ([0] string string1,
[1] string string2)
IL_0000: nop
IL_0001: ldc.i4.s 9
IL_0003: newarr [mscorlib]System.Char
IL_0008: newobj instance void [mscorlib]System.String::.ctor(char[])
IL_000d: stloc.0
IL_000e: ldc.i4.s 9
IL_0010: newarr [mscorlib]System.Char
IL_0015: newobj instance void [mscorlib]System.String::.ctor(char[])
IL_001a: stloc.1
IL_001b: ret
} // end of method Program::StringVsVarILOutput
답변
C # 컴파일러는 var
컴파일시 변수 의 실제 유형을 유추합니다 . 생성 된 IL에는 차이가 없습니다.
답변
분명히, 그것은 게으른 코딩 스타일입니다. 선택의 여지가있는 기본 유형을 선호합니다. 코드 / 디버그 시간에 내가 생각하는 것을 정확하게 읽고 쓰고 있는지 확인하기 위해 여분의 “잡음”을 사용하겠습니다. * 어깨를 으쓱하다 *
답변
나는 당신이 읽은 것을 올바르게 이해했다고 생각하지 않습니다. 올바른 유형으로 컴파일되면 차이 가 없습니다. 내가 이것을 할 때 :
var i = 42;
컴파일러 는 그것이 int 임을 알고 내가 작성한 것처럼 코드를 생성합니다.
int i = 42;
링크 한 게시물이 말한 대로 동일한 유형으로 컴파일 됩니다. 런타임 검사 또는 추가 코드가 필요한 것은 아닙니다. 컴파일러는 유형이 무엇인지 파악하고 사용합니다.