2013-01-13 1 views
8
public struct Unit 
{ 
    Unit u; 
} 

원인 :C#의 클래스에 순환 레이아웃 문제가없는 이유는 무엇입니까?

구조체의 멤버 유형 '단위'의 'Unit.u'는 구조체 레이아웃주기가 발생합니다.

그러나

public class Unit 
{ 
    Unit u; 
} 

은 컴파일합니다. 내가 생각하는 문제를 이해합니다. 다른 멤버를 초기화해야하기 때문에 Unit 오브젝트를 참조 할 때 무한 사이클이 형성 될 것입니다. Unit 등등. 그러나 컴파일러가 왜 structs에 대해서만 문제를 제한합니까? class에도 문제가 계속 발생하지 않습니까? 내가 놓친 게 있니?

답변

20

레이아웃의 문제는입니다.

Unit이 구조체 인 경우 Unit의 모든 값에는 동일한 유형 (따라서 동일한 크기)의 다른 값 (무한 값)이 있어야합니다. 불가능합니다. 당신이 다른 필드가 없다고 주장 할 수 있다고 가정 해 봅시다. Unit 필드는 아무런 메모리도 차지하지 않아야합니다. 따라서 자체 내에 포함될 수 있습니다.하지만 CLR이 작동하는 방식은 모든 구조체가 적어도 1 바이트를 차지한다는 것을 믿습니다. ..

Unit 클래스이다하는 Unit 객체는 다른 객체에 Unit 참조를 포함한다. 스토리지 문제가 없으며 시작 값이 null 일 수 있습니다.

이런 식으로 생각하십시오 : 당신은 같은 청사진으로 지어진 다른 집을 가지고있을 수는 없지만, 비슷한 집 주소가있는 종이가있는 집은 확실히 가질 수 있습니다.

+0

아 맞습니다. Din은 그걸 멀리 생각해. 고마워. – nawfal

+0

@ 존, 집 예제는 참으로 훌륭합니다! :) – nawfal

+1

마지막 비트에서 간결하게 설명했습니다. +1 –

3

클래스는 참조 유형이므로 차이점은 class 예에서 다른 인스턴스에 대한 참조 만 저장해야한다는 것입니다. struct 값 유형의 경우 전체 구조를 다시 포함해야하므로 무한 루프가 필요합니다.

1

Structvalue type입니다. Unit은 그 자체로 값을 보유 할 수 있습니까? 나는 이것이 가능하지 않다고 생각한다.

그러나 Unitclass 일 때, classreference type입니다. Unit 개체는 참조을 다른 Unit 개체로 유지할 수 있습니다. 그것은 괜찮습니다. Unit 값이 Unit 값을 포함하는 Unit 값 등을 포함하는 Unit 값을 포함하여 예제 있도록

2

struct가 자동으로 ... 값으로

귀하의 class 예 만이 초기화 초기화됩니다 무한 회귀가없는 null에 대한 참조입니다.다음했다면 당신은 그러나 비슷한 문제가 발생하는 것입니다 :

class Unit 
{ 
    Unit mUnit = new Unit(); 
} 

자,이 Unit이 경우 ... 등하는 Unit 구성하는 Unit을 구축 구성을, 당신은 런타임 스택 오버 플로우 예외가 발생합니다 경우/Unit 개체를 인스턴스화 할 때.

nullable 유형을 사용하여 struct 문제를 피할 수 있다고 생각했지만 문제가 남아 있습니다. 이 사실은 null으로 설정하면 null이 허용되는 struct이 여전히 인스턴스화되기 때문에 발생한다고 생각합니다.

+1

귀하의 가정은 사실 모두 틀린 것입니다. 편집하십시오. 첫 번째로 나는 struct와 같은 컴파일 타임 경고가 없다는 것을 의미한다. – nawfal

+0

@nawfal 당신은 더 구체적 일 수 있습니까? –

+0

컴파일 오버 타임 경고를 받았다고 말하지 않았지만 스택 오버 플로우가 발생한다고 경고했습니다. –