ValueType을 Object로 복싱하는 것과 관련된 몇 가지 최근 질문, 특히 특정 인스턴스에서 발생했는지 여부가있었습니다.복싱 비교 ValueType; 차이점이 뭐야?
"복싱"ValueType (참조 된 개체로 처리)과 단순히 참조로 액세스하는 것 (예 : ref 또는 out 키워드 사용)의 차이점은 무엇인지 몰랐습니다. 전달은 그냥 "포인터"입니다)? 두 경우 모두 그 값이 가리킬 수있는 곳입니다 (Object의 경우 힙, 로컬 범위의 ValueType은 정확히 ...).
내가 C++에 대해 알고있는 것으로부터 추측해야만한다면 다음과 같이 작동한다고 말할 수 있습니다. 참조로 액세스되는 ValueType (매개 변수 키워드를 통해 가정 해 봅시다)은 범위가 지정된 호출 스택의 레벨에 남아 있습니다. 스택에서 해당 변수의 버킷에 대한 "바로 가기"포인터가 만들어져 스택의 다음 계층의 일부가됩니다. 값은 이미 메모리 (아마도 CPU 캐시)에 저장되어 있기 때문에 힙에 새로운 것을 인스턴스화 할 필요가 없습니다. 유일한 새로운 것은 자체 ValueType (IntPtr)이며 자체적으로 스택에 저장되는 포인터이므로 AFAIK는 힙에 뭔가를 넣는 것보다 빠를 것입니다.
이게 무슨 일 이니, 아니면 다른 일이 있을까요?
편집 : 더 명확 :
public void TakesAnObject(Object obj) {...}
public void TakesAnIntValueType(ref int myValue) {...}
public void AnotherIntParameterMethod(out int myValue) {...}
...
//this locally-scoped variable is simply created on the stack.
int myInt = 5;
//Performs boxing; an Object is instantiated in the heap that holds the
//variable value from the stack, and that is passed by ref.
TakesAnObject(myInt);
//Apparently does NOT perform boxing, but we're still dealing with a reference.
//So what's going on?
TakesAnIntValueType(myInt);
//Again created on the stack, with the default 0.
int anotherInt;
//Again, apparently no boxing, but we're dealing with a reference to anotherInt.
AnotherIntParameterMethod(anotherInt);
당신이 이야기하고있는 두 가지 시나리오의 완전한 예제를 줄 수 있다면 도움이 될 것입니다. 지금이 순간 무슨 뜻인지는 분명치 않습니다. –