2011-02-18 1 views

답변

1

아니오, 복싱이 필요하지 않습니다. intToString을 재정의하기 때문입니다. 컴파일러는 호출 할 메소드를 정확하게 결정할 수 있으므로 가상 디스패치를 ​​수행 할 필요가 없습니다. 심지어 callvirt를 사용하지 않습니다 - 그 전화는

call instance string [mscorlib]System.Int32::ToString() 

의 IL에 해당하는 것입니다 당신이 구조체에서하지 재정 ToString() (등)를 할 경우, 복싱 필요합니다 가상 메서드 호출합니다.

+1

@ 리차드 : 그것은 객체가 아닙니다. 그러나 "ldc.i4.5; stloc.1"을 사용하여 값이 할당 된 로컬 변수를 효과적으로 가져올 수 있습니다. 가장 쉬운 방법은 ildasm 또는 Reflector를 실행하는 것입니다. –

+0

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

+0

@Richard는 접미사가 의미하는 것은 5d.ToString()입니다 (예 : "d"는 double의 접미사 임). –