구조체의 인스턴스가 힙 또는 스택에 존재한다는 사실은 전혀 관련이 없습니다. 마이크로 소프트가 CLR을 구현할 때 그것이 힙에 생겨날 것이라는 점을 알아두면 좋지만, 그 점이 중요합니다. 그것은 단지 구현 세부 사항입니다.
값 유형 (구조체)에는 항상 값 의미가 있습니다.
이
struct Data { public int a; public int b; } // Don't do this at home
var x = new Data { a = 1, b = 42 }; // x.a == 1, x.b == 42
var y = x; // x.a == 1, x.b == 42, y.a == 1, y.b == 42
y.a = 2; // x.a == 1, y.a == 2
var z = y; // x.a == 1, y.a == 2, z.a == 2
z.a = 3; // x.a == 1, y.a == 2, z.a == 3
// All variables hold a different copy of the struct
Debug.Assert(x.a == 1);
Debug.Assert(y.a == 2);
Debug.Assert(z.a == 3);
Debug.Assert(x.b == 42);
Debug.Assert(y.b == 42);
Debug.Assert(z.b == 42);
(이 사실은 같은 가변 구조체를 가지고 일반적으로 나쁜 생각을한다 : 더 메소드 호출이없는 경우에도이 관련이 있기 때문에, 그들은 패스에 의해 가치가 있다는 말과 동일하지 않습니다 . 위의 난 그냥 데모 목적을 위해 그것을 사용하는 실제 코드에하지 마 불변 귀하의 값 형식을 유지)
당신이 참조 형이 있다면, 당신은 다른 그림 것 :...
class Data { public int a; }
var x = new Data { a = 1 }; // x.a == 1
var y = x; // x.a == 1, y.a == 1
y.a = 2; // x.a == 2, y.a == 2
var z = y; // x.a == 2, y.a == 2, z.a == 2
z.a = 3; // x.a == 3, y.a == 3, z.a == 3
// All variables hold a reference to the same object:
Debug.Assert(x.a == 3);
Debug.Assert(y.a == 3);
Debug.Assert(z.a == 3);
을 여기에 트릭이 있습니다 : * 힙과 스택을 잊어 버리는 것 *. 참조로 처리되는 참조 유형, 값 유형은 값으로 처리됩니다. 그게 전부 야. –