valuetype 래퍼용 쓰레기 수집
-
03-07-2019 - |
문제
값 유형이 객체처럼 행동 해야하는 경우, 값 유형을 참조 객체처럼 보이게하는 래퍼가 힙에 할당되고 값 유형의 값이 복사됩니다. 래퍼가 표시되어 시스템에 값 유형이 포함되어 있음을 알 수 있습니다.
이것은 "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의 '일반'객체와 다르지 않습니다.
이 객체 ( '상자'라고도 불리는 '상자'라고도 함)는 다른 객체와 마찬가지로 쓰레기 수집기도 동일합니다.
제휴하지 않습니다 StackOverflow