0
나는 권투() 리터럴 정수 (5)에서 호출하는 ToString 위해서는 일어나고 궁금 :정수 리터럴 (예 : ToString)에서 개체 메서드를 호출 할 때 CLR 리터럴 먼저 boxing됩니까?
5.ToString();
아, 그렇지 않은 경우는 CLR 위해서는 무엇이 일어나고 있는지하는 것으로 ToString() 메서드를 호출 할 수 있습니까?
나는 권투() 리터럴 정수 (5)에서 호출하는 ToString 위해서는 일어나고 궁금 :정수 리터럴 (예 : ToString)에서 개체 메서드를 호출 할 때 CLR 리터럴 먼저 boxing됩니까?
5.ToString();
아, 그렇지 않은 경우는 CLR 위해서는 무엇이 일어나고 있는지하는 것으로 ToString() 메서드를 호출 할 수 있습니까?
아니오, 복싱이 필요하지 않습니다. int
이 ToString
을 재정의하기 때문입니다. 컴파일러는 호출 할 메소드를 정확하게 결정할 수 있으므로 가상 디스패치를 수행 할 필요가 없습니다. 심지어 callvirt를 사용하지 않습니다 - 그 전화는
call instance string [mscorlib]System.Int32::ToString()
의 IL에 해당하는 것입니다 당신이 구조체에서하지 재정 ToString()
(등)를 할 경우, 복싱 필요합니다 가상 메서드 호출합니다.
@ 리차드 : 그것은 객체가 아닙니다. 그러나 "ldc.i4.5; stloc.1"을 사용하여 값이 할당 된 로컬 변수를 효과적으로 가져올 수 있습니다. 가장 쉬운 방법은 ildasm 또는 Reflector를 실행하는 것입니다. –
Thanks Jon! :-) 그리고 위의 내 의견에 대한 내 자신의 질문에 답하기 위해 (이중에 대해), _ECMA-334 : 9.4.4.2 Integer Literals_는 "리터럴에 접미사가 없으면 그 값의 첫 번째 유형을 갖습니다 int, uint, long, ulong. 리터럴에 접미사가 없으면 int, uint, long, ulong의 값을 나타낼 수있는 첫 번째 유형이 있습니다. " 내 예제에서는 int가 될 것입니다. 내 예제에서 5.2.ToString()을 사용했다면, ulong 타입의 지역 변수를 생성했을 것입니다. 여기서 찾을 수 있습니다 - http://en.csharp-online.net/ECMA-334:_9.4.4.2_Integer_literals – richard
@Richard는 접미사가 의미하는 것은 5d.ToString()입니다 (예 : "d"는 double의 접미사 임). –