, 난 치형 (int
)의 가상 메소드 호출값 유형에 대한 가상 호출이 값 및 박스 값에 대한 포인터와 함께 작동하는 이유는 무엇입니까? 아래 예에서
namespace ShortTest
{
class Program
{
static void Main(string[] args)
{
int i = 42;
i.ToString();
((object)i).ToString();
}
}
}
리플렉터 생성 CIL 찾고, I는 두 전화에 다음 코드를 볼 수
.locals init ([0] int32 i, ...)
...
L_001a: ldloca.s i
L_001c: call instance string [mscorlib]System.Int32::ToString()
L_0021: pop
L_0022: ldloc.0
L_0023: box int32
L_0028: callvirt instance string [mscorlib]System.Object::ToString()
L_002d: pop
...
this
매개 변수는 첫 번째 경우에는 int에 대한 관리되는 포인터이고 두 번째 경우에는 박스형 int
(즉, 헤더 필드와 int 필드가있는 개체에 대한 포인터)에 대한 참조입니다.
동일한 방법이 두 호출 (int
은 ToString()
을 구현합니다)에 사용되었으므로 어떻게 작동합니까? System.Int32::ToString()
메서드는 this
포인터에서 ldind.i4
을 사용하여 int
의 값을 검색하므로 첫 번째 경우에는 int
의 값을 가져야하지만 상자에있는 int
의 첫 번째 필드 (머리글)의 값을 가져와야합니다. 두 번째 경우는 :
L_0000: ldarg.0
L_0001: ldind.i4
...
사양 (ECMA335)에서 설명 된 동작이 어디인지 말해 줄 수 있습니까? 감사 ! –
참조 (ECMA 335, 파티션 II, 섹션 13.3 값 유형의 메소드)를 찾았으므로이를 대답으로 편집했습니다. –
@ GeorgesDupéron 그것보다 조금 복잡하다는 것이 드러났습니다. 편집하고있었습니다. – hvd