2011-02-16 3 views
5

는 내가 가진 :클래스 내의 구조체가 값으로 전달 되었습니까?

구조체

struct Data { int a; int b; } 

구조체

class Packet { 
    Data DataStruct; 
} 

지금 내 클래스를 인스턴스화

를 포함하는 클래스 나 구조체가 힙에 살고 있다고 가정합니다. 는

SomeClass.Process(new Packet().DataStruct); 
SomeClass.Process(new Packet().DataStruct.a); 

같은은이 값으로 전달됩니다 지금 않는 경우?

그렇지 않은 경우 구조체를 클래스로 만들지 않는 이유가 있습니까?

+1

을 여기에 트릭이 있습니다 : * 힙과 스택을 잊어 버리는 것 *. 참조로 처리되는 참조 유형, 값 유형은 값으로 처리됩니다. 그게 전부 야. –

답변

3

struct은 값 유형이므로 value으로 전달됩니다. Classesreference 유형입니다.

out 또는 ref이 지정되지 않은 한 모든 것이 value으로 전달됩니다.

+1

참조가 참조로 전달 될 때 클래스 참조는 'out'또는'ref'가 아닌 한 값으로 전달됩니다. –

+0

나는 본다. 그래서, 만약 내가 다음과 같은 것을 가지고 있다면 :'c = new C(); a = c;'c에 대한 _reference는'a'에 복사됩니까? 'b = new Struct(); a = b' 실제로 데이터 자체를 복사합니다. – lejon

+2

예, 맞습니다. –

1

구조체는 항상 값에 의해 전달됩니다. 다시 말해, 복사본이 만들어져 호출 된 함수에 제공됩니다.

구조체가 힙에 할당되는 동안 실제로 구조체가 별도의 엔티티가 아닌 클래스에 포함됩니다.

+1

더 정확히 말하면, 매개 변수에'ref' 또는'out' 수정자가 없으면 모든 것이 값으로 전달됩니다. (참조 유형의 경우 _reference_도 값으로 전달됩니다) –

+0

@ 제프, 좋은 지적입니다! – Nick

1

구조체의 인스턴스가 힙 또는 스택에 존재한다는 사실은 전혀 관련이 없습니다. 마이크로 소프트가 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); 
관련 문제