2009-12-29 3 views
5

http://msdn.microsoft.com/en-us/library/ms229017.aspx에 따르면 값 유형은 "스택에 배치되거나 다른 구조체와 함께 인라인으로 할당됩니다"*. 그러나 the stack is an implementation detail에서 Eric Lippert는 이것이 구현 세부 사항이라고 말합니다.스택이 구현 세부 사항입니까, 아니요?

구현 세부 사항은 "a behavior produced by code which may be relied on by consuming code, though that behavior is not specified by the spec the code is written to."입니다. 설명서가 사양이 아니라는 것을 이해합니다. 아마도 문서에 나와있는 설명서에 무엇인가가 나열되어 있고 더 이상 구현 세부 사항이 아닌 경우에도 마찬가지입니다. 스택이 구현 세부 사항입니까 아니면 그렇지 않습니까?

* : 구조체가 잘못되었을 수 있지만 구조체를 힙에 직접 배치하는 대신 다른 구조체 내부에도 할당 할 수 있음을 이해합니다.

+0

관련 질문 : http://stackoverflow.com/questions/1970894/struct-what-is-it-for/1970902#1970902 –

+0

방금 ​​전에 복제본으로 플래그를 지정했습니다. :) – RCIX

답변

11

MSDN 설명서는 Microsoft C# 컴파일러가 struct에 사용하는 특정 구현에 대해 알려줍니다. 이러한 특정 세부 사항은 ECMA 334 C# 사양에 없습니다. 그들은 struct의 의미 체계의 일부가 아닙니다. 따라서 문서의 세부 사항은 구현 세부 사항입니다.

에릭 리 퍼트 (Eric Lippert)는 struct과 관련하여 설명서에 스택에 대한 언급이 없기를 바란다고 (또는 내가 선호하는 수준을 기억하지 못한다고) 말한 것을 기억합니다. 나는 그것을 파낼 수 있는지 보자. 여기

그것을, 당신은에 링크 된 블로그 게시물에서 : 나는이 문서가 가장 관련성이 무엇인지에 초점을하지 않는 것을 후회

; 대부분 관련성이없는 구현 세부 사항에 초점을 맞춤으로써 구현 세부 사항의 중요성을 확대하고 값 유형을 의미 상 유용하게 만드는 요소의 중요성을 모호하게 만듭니다. 나는 "스택"이 무엇인지 설명하는 모든 기사가 "가치에 의해 복제 된"것이 무엇을 의미하는지, "가치에 의한 복제"를 오해 또는 오용하여 버그를 유발할 수있는 방법을 설명하는 대신 시간을 보냈 으면 좋겠다.

ECMA 334 C# 사양의 관련 섹션은 §11입니다. 이 섹션에서는 "스택"이라는 단어를 사용하지 않습니다. 이 절에서는 단순히 문법을 설명하고 그 문법은 값 의미를 따르고 암시 적으로 봉인되어 System.ValueType에서 상속받으며 struct 유형의 변수에 대한 할당은 값으로 매개 변수로 struct을 전달하여 복사본을 만듭니다. struct들합니다 (struct의 모든 값 형식 필드가 기본값으로 설정되어, 모든 참조 형식 필드가 null로 설정) 초기 값으로 설정하는 방법, 권투와 struct의 언 박싱, struct들에 대한 this의 의미를 둘러싼 규칙 필드 초기화, 생성자, 소멸자 및 정적 생성자가 struct에서 어떻게 작동하는지에 대해 설명합니다. 스택에 대해서는 언급하지 않았습니다. 이제까지.

스택은 구현 세부 사항이며, 의미는 struct이 아닙니다.

1

값 유형에 대해 수행 된 모든 안전한 연산이 구조체가 스택 또는 힙에 할당되었는지 여부와 직각을 이루기 때문에 '스택'은 구현 세부 사항입니다.

주소를 가져 와서 직접 (예 : 레거시 API를 통해) 사용하는 것과 같이 차이를 만들 수있는 작업 (즉, 할당 취소 된 스택 프레임을 참조하는 작업)은 안전하지 않고 오류가있는 사용입니다 마샬링 API 사용).

관련 문제