문제

내가 가진 또 다른 최근의 C# 인터뷰 질문은 권투와 개봉이 무엇인지 아는 것이 었습니다. 값 유형은 힙의 스택 및 참조 유형에 있다고 설명했습니다. 값이 참조 유형으로 캐스팅되면 권투라고 부르며 그 반대도 마찬가지입니다.

그런 다음 그는 이것을 계산 해달라고 요청했습니다.

int i = 20;
object j = i;
j = 50;

무엇인가요 i?

나는 그것을 엉망으로 만들었고 50을 말했다. 실제로 나는 실제로 20이라고 말했다. 이제 나는 그것을 이해한다고 생각한다. 그러나 왜 다른 조합을 가지고 놀 때 나는 이것을보고 놀랐다.

Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing

나는 볼 것으로 기대했다 b == 2 또한 그렇지 않지만 왜 그렇지 않습니까? 두 번째 권투가 전체를 파괴하고 대체하기 때문입니다. a 힙에 물체?

내가 이것을하면 괜찮아요 :

public class TT
{
    public int x;
}

TT t = new TT();
t.x = 1;
TT t2 = new TT();
t2.x = 2;
t = t2;
t.x = 3;

무엇인가요 t2.x? 그것은 3이어야합니다. 그러나 이것은 권투 / 무 복원의 예가 아닙니다. 이것이 맞습니까? 그렇다면 이것을 어떻게 요약 하시겠습니까?

위와 같이 권투/무 복싱 변환에서 값이 동일해질 수 있습니까?

도움이 되었습니까?

해결책

  1. 두 번째 과제가 첫 번째 과제를 대체합니다. 박스 값을 변경하지 않습니다.

  2. 예제는 권투를 사용하지 않습니다. 값 (int)은 박스가 아닌 int로 저장됩니다.

  3. 아니요, 권투는 여전히 불변성 보장을 유지합니다.

다른 팁

매우 짧습니다 : 복싱은 의미합니다 참조 유형의 새 인스턴스 생성. 이것을 알고 있다면, 당신은 한 인스턴스가 다른 인스턴스를 만들어 변하지 않는다는 것을 이해합니다.

당신이하고있는 일 a = 2 '박스'에서 값을 변경하지 않으면 참조 유형의 새 인스턴스를 생성합니다. 그렇다면 왜 다른 것이 변해야합니까?

나는 B == 2를 볼 것으로 기대했지만 왜 그렇지 않습니까? 두 번째 권투가 힙의 전체 (a)-개체를 파괴하고 대체하기 때문입니까?

아니요, 정확히 아닙니다. 힙에있는대로 물체를 남깁니다 ( b 변수도 참조하고) 새 값에 대한 새 개체를 만듭니다. a 변수가 참조됩니다.

두 번째 예제는 권투를 사용하지 않는다는 것이 옳습니다. 상자를 공급하는 것 외에 다른 방식으로 박스화 된 값에 액세스 할 수 없으므로 상자 값을 변경할 수있는 방법이 없습니다.

변한 구조물도 좋아하지 않습니다 Point 박스가있을 때 변경할 수 있습니다. 구조물의 속성에 액세스하려면 상자를 공급해야하므로 박스형 구조물을 제자리에 변경할 수 없습니다.

스테판의 의견을 뒷받침하는 또 다른 흥미로운 변형이 있습니다.

        int i = 2;
        object a = i; // Boxing
        object b = a; // Referencing same address on heap as 'a', b == a

        b = i; // New boxing on heap with reference new address, b != a

B는 값이 1의 값으로 여전히 힙의 물체를 가리키는 참조이기 때문에 B는 여전히 1입니다. a는 값이 2 인 힙의 새 개체에 할당 되었기 때문에 2입니다.

T2.x는 3이기 때문에 T2는 힙의 동일한 물체에 대한 두 가지 다른 참조이기 때문에 3입니다.

Unboxing에 대한 귀하의 질문에 대한 답변은 다음과 같습니다. Unboxing 변환의 결과는 임시 변수입니다 (자세한 내용 : 자세한 내용 : 링크).

나는 당신이 STH를 좋아하려고했다고 생각합니다.

object a = new Point(10,10);
object b = new Point(20,20);
a = b;

((Point) b).X = 30; //after this operation also a.X should be 30

위의 코드는 컴파일되지 않습니다 - 위의 링크의 세부 사항은 이것이 귀하의 질문에 대한 답이라고 생각합니다.

나는 B == 2를 볼 것으로 기대했지만 왜 그렇지 않습니까? 두 번째 권투가 힙의 전체 (a)-개체를 파괴하고 대체하기 때문입니까?

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