2010-02-26 4 views

답변

27

당신은 GUID를 자신의 정의를 볼 수 있습니다

public struct Guid ... 

또는 당신은 이런 식으로 테스트 할 수 있습니다 :

bool guidIsValueType = typeof(Guid).IsValueType; 

GUID 년대 나를 생각하게 새로운 키워드를 사용하여 만들어집니다 참조 유형은 입니다.

구조체도 생성자를 가질 수 있습니다 (예 : new DateTime(2012, 12, 23)).

+0

값 유형이 아님 -> @ Randolpho의 대답을 참조하십시오. – CodingYourLife

30

GUID를 값 형식입니다.

MSDN을 참조하십시오. Guid는 struct입니다. 모든 구조체는 Value Types입니다.

+4

실제 클래스 인 System.ValueType을 제외하고는 다음과 같습니다. – JaredPar

+1

@JaredPar : 사실이지만 추상화되어있어 인스턴스화의 위험이 없습니다. – Randolpho

5

실제로는 Guid입니다. 모든 유형은 new 키워드를 사용하여 구성됩니다. 참조 유형은 class, interface 또는 delegate (모든 참조 유형) 또는 struct 또는 enum (값 유형)인지 여부에 따라 값 유형에서 식별 할 수 있습니다.

+4

값 유형 목록에 enum을 추가 할 수 있습니다. –

15

GUID는 참조 키워드라고 생각하는 새 키워드를 사용하여 만듭니다.

생각하지 마세요. 값 유형은 생성자도 가질 수 있습니다. 이상하게도 완벽하게 합법적입니다.

int x = new int(); 

x에 0을 할당하는 것과 같습니다.

이 정보가 맞습니까?

아니요.

GUID가 힙에 저장되어 있습니까?

예. 안내선도 스택에 저장됩니다.

아래 분석은 CLI 구현이 Windows에서 실행되는 Microsoft "데스크톱"또는 "Silverlight"CLR이라고 가정합니다. CLI의 다른 버전이 무엇인지, Mac에서 무엇을하는지 등에 대해서는 전혀 알지 못합니다.다른 구현에서 특정 메모리 덩어리가 스택에 저장되어 있는지 여부를 알아야하는 경우 해당 구현에 대해 전문가 인 사람에게 질문해야합니다.

GUID는 다음과 같은 상황에서 스택에 저장된다

1 GUID를 지속적으로 계산 한 "임시"결과 또는 방법의 인수로서 사용되는 경우. 예를 들어, M (new Guid())를 호출하면 새 Guid의 임시 저장소가 스택에 할당됩니다.

(2) Guid가 (a) 반복자 블록에없는 로컬 변수이거나 (b) 익명 메소드 또는 람다 식의 닫힌 외부 변수가 아닌 경우.

다른 모든 경우에는 Guid가 스택에 저장되지 않습니다. GUID는 참조 유형의 필드, 배열의 요소, 익명 메소드의 클로즈드 오버 로컬 또는 람다 식의 필드 또는 반복기 블록의 로컬 일 때 힙에 저장됩니다.

Guid는 GC 힙이나 스택에도 저장할 수 없습니다. Guid는 안전하지 않은 포인터 산술을 통해 액세스되는 완전히 관리되지 않는 메모리에 저장 될 수 있습니다.

GUID 비트가 스택에 있는지 힙에 있는지에 대해 궁금한 점이 있습니다. 그게 무슨 차이가 있니?

+0

음, 어디서나 저장할 수있는 명확한 guid가되었으므로 문제가되지 않을 것입니다. – SoftwareGeek

+0

소프트 실시간 응용 프로그램 (애니메이션, 게임, 일부 UI 작업)을 작성하는 경우 소프트웨어의 특정 "루프"또는 반복 과정에서 GC 할당을 줄이거 나 상각하거나 제거해야하는 경우가 있습니다. 이렇게하면 해당 루프 내에서 사용자가 볼 수있는 애니메이션 "걸쇠"를 유발하는 GC 수집을 줄이거 나 없앨 수 있습니다. 따라서 객체를 캐시하거나 객체 풀링을 사용할시기를 결정하기 위해 특정 코드 행 "allocs"이 필요한지 여부를 파악해야합니다. 예 : C#으로 완전히 작성된 부드러운 실시간 물리 시뮬레이션은 충돌 또는 통합 단계에서 할당하지 않아야합니다. –

관련 문제