2016-07-01 1 views
0

이 값 형식 상자 질문에 관한 것입니다. (INT32) 어떻게 내부 값 형식 피할 상자


나는 IL 코드를 확인

, 내가 IL이 Int32.ToString()를 호출 발견,

및 Int32.ToString 미만 중첩 방법() 더 박스 작업이 없습니다,

우리가 아는 한 값 유형이 참조 유형으로 변환하는 경우, 상자가,

및 C#은 우리에게 또 다른 방법을 제공하지 않습니다 과정 t 그의 변신.


어떻게 값 유형이 참조 클래스 (문자열)로 변환됩니까?

답변

3

값 타입의 인스턴스 메소드를 호출 가능한는 정적 호출 또는 호출 "제한"을 사용하고; 유형이 필수 메소드 (object 구현 필요)를 구현하지 않는 한 상자가 필요하지 않습니다. 왜 상자가 필요한가요? 그것은 단지 : 하나를 필요로하지 않기 때문에 하나를 만들지 않습니다.

참고 : 항상은 값 유형을 만들 때 모든 메소드를 무시해야합니다. 예를 들어 ToString()을 재정의하지 않으면 이 가상 기본 메서드를 호출하는 상자를 만들어야하지만 을 수행하면이 재정의되고 컴파일러는 재정의, 안전성을 정적으로 호출 할 수 있습니다. 인스턴스가 결코 null이 아니며 하위 유형에 의해이 메소드가 절대로 더 이상 오버라이드되지 않는다는 사실을 알고 있어야합니다. 보조 노트로

:

  • 대상이 경우 "제약"컴파일러 방출하도록 선택할 수 있습니다 본질적으로 말을 JIT에 핸들을 전달하고 모든 경우에 가치 유형에서 를 호출 타겟이 방법을 구현하는 값 유형 인 경우 참조 형, 역 참조와 사용이 달리
  • 를 정전기 호출 역 참조 상자 사용할 사용
  • 달리 가상가-호출 가상를-호출

그러나 inbuilt 유형 (int 등)의 경우 static-call을 통해 메소드로 직접 이동하는 것이 더 일반적입니다. "제한된"접근 방식을 기본으로 사용하는 이유는 누군가가 유형을 선언하는 라이브러리를 변경 (구현 추가 또는 제거) 할 때에도 사용하는 것이 안전하다는 것입니다.

+0

Console.WriteLine ("123456 {0}", 3.ToString())을 호출하면됩니다. 값 유형 3은 참조 유형 문자열에서 어떻게 결합됩니까? 어떤 상자도 필요 없다고 말하지만, 스택 프레임의 3이 힙의 문자열로 이동하는 방법은 무엇입니까? –

+1

@LuffyDing 값 유형 3은 힙으로 이동합니다. ToString() 메소드는 길이가 1이고 값이 50 인 유니 코드 코드 포인트를 포함하고있는'string * '으로 * 발생하는 * 전혀 관련이없는 새로운 객체를 생성합니다 (이 객체는 모양이' 3'')과 아마도 터미네이터가 없지만 스택의 원래 값과 거의 관련이 없습니다.이 값은 –

+1

에서 "itoa"스타일 연산을 실행 한 값입니다. ldstr','ldc.i4.3','call' (int.ToString()),'call' (string.Format (string, string)),'call' (Console.WriteLine (string)) (줄이거 나 가져 가라. 실제로'int.ToString' 호출을하기 위해'stloc' /'ldloca' 쌍을 사용해야한다.) –