문제

인용 ValueType 클래스의 MSDN 링크

값 유형이 객체처럼 행동 해야하는 경우, 값 유형을 참조 객체처럼 보이게하는 래퍼가 힙에 할당되고 값 유형의 값이 복사됩니다. 래퍼가 표시되어 시스템에 값 유형이 포함되어 있음을 알 수 있습니다.

이것은 "integervariable.tostring (); 생성 된 래퍼-오브젝트는이 메소드와 유사하게 다른 모든 System.Object를 사용할 수 있습니다.

이 이해가 정확합니까?

이 객체는 '일반'객체와 어떻게 다릅니 까?

그러한 물체에 대해 쓰레기 수집이 다릅니 까? 그렇다면 어떻게?

미리 감사드립니다.

도움이 되었습니까?

해결책

래퍼는 "상자"입니다. 상자의 재료 수집 - 있습니다 아니요 Grabage Collector에 관한 한 차이. 상자는 다른 대상과 정확히 동일한 규칙과 처리로 수집됩니다.

그러나 값 유형이 메소드 (예 : ToString()), 메소드를 호출하기 위해 상자를 할 필요는 없습니다. 따라서 가치 유형은 (일상적인 문제로) 많은 object 가능한 방법; -p

IL의 차이 (반사판을 통해)의 차이를 볼 수 있습니다. 그래서 C#:

static int GetInteger() {return 123;}
static string TestToString() {
    int i = GetInteger(); // to prove no cheating
    return i.ToString();
}
static Type TestGetType() {
    int i = GetInteger(); // to prove no cheating
    return i.GetType();
}

우리는 IL을 가지고 있습니다 :

.method private hidebysig static string TestToString() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloca.s i
    L_0008: call instance string [mscorlib]System.Int32::ToString()
    L_000d: ret 
}

.method private hidebysig static class [mscorlib]System.Type TestGetType() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: box int32
    L_000c: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    L_0011: ret 
}

주목하십시오 ToString() 상자가 포함되어 있지 않지만 GetType() does at L_0007 ((는 안 돼요) 재정의 가기 때문에)

다른 팁

예, 이해가 옳습니다.

이 객체는 CLR의 '일반'객체와 다르지 않습니다.

이 객체 ( '상자'라고도 불리는 '상자'라고도 함)는 다른 객체와 마찬가지로 쓰레기 수집기도 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top