Guid는 모두 0입니까?


241

Guids를 사용하여 개체를주고받는 일부 WCF 서비스를 테스트하고 있습니다. 내 웹 앱 테스트 코드에서 다음을 수행하고 있습니다.

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = new Guid()
});

어떤 이유로 new Guid ()를 호출하면 다음과 같이 모두 0으로 Guid 를 생성합니다.

00000000-0000-0000-0000-000000000000

이 문제의 원인은 무엇입니까?


9
편집 후, 이것은 완전히 새로운 질문입니다. 그리고 새로운 답변을 결정하기 위해서는 훨씬 더 많은 정보가 필요합니다.
Scott Rippey

3
질문을 변경 한 편집 된 부분을 제거했습니다.
Didaxis

115
+1이 질문을 사용하여 빈
길드를

5
@jmosesman, 그것은 형태로 사용하는 것이 좋습니다Guid.Empty
조나단 Moosekian

4
@JonathanM 실제로 SQL 스크립트에서 사용하고 있습니다. 이 게시물은 검색 후 먼저 나타납니다.
jmosesman

답변:


428

Guid.NewGuid()기본 생성자를 호출하는 대신 정적 메소드 를 사용하십시오 .

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = Guid.NewGuid()
});

18
정답에 대한 +1과 올바른 문서에 대한 링크입니다.
ObscureRobot 2011

109

이것으로부터 배우는 교훈 :

1) Guid는 참조 유형이 아닌 값 유형입니다.

2) new S()모든 값 유형 에서 기본 생성자 를 호출하면 항상 그 값 유형의 모든 제로 형식을 반환합니다. 논리적으로와 동일합니다 default(S).


3
그것은 동일한 IL로 컴파일 default(S)되거나 누락 된 미묘한 부분이 있습니까?
구성자

8
@configurator : 그렇습니다. 실제로 컴파일러의 "default (S)"와 "new S ()"의 내부 표현은 동일합니다. 우리는 그것들을 내부적으로 구별하지 않으며, 이는 실제로 완전히 동일 하지 않기 때문에 몇 년 동안 불행한 버그로 이어졌습니다 . 예를 들어, const int x = new int();사양에 따라 합법적 인 것으로 간주되지는 않습니다 const int x = default(int);. 우리는 둘 다 허용합니다.
Eric Lippert

1
@configurator-관련 코너 사례에 관심이 있다면 아마도 msmvps.com/blogs/jon_skeet/archive/2008/12/10/… 도 관심이있을 것입니다.
kvb

56

대신 이것을 시도하십시오 :

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = new Guid.NewGuid()
});

'실제'Guid 값이 생성됩니다. 참조 유형을 새로 만들면 기본값이 제공됩니다 (이 경우 Guid의 경우 모두 0 임).

새 Guid를 만들면 Guid의 기본값 인 모든 0으로 초기화됩니다. 기본적으로 "new"int (값 유형이지만 어쨌든이 작업을 수행 할 수 있음)를 만드는 것과 같습니다.

Guid g1;                    // g1 is 00000000-0000-0000-0000-000000000000
Guid g2 = new Guid();       // g2 is 00000000-0000-0000-0000-000000000000
Guid g3 = default(Guid);    // g3 is 00000000-0000-0000-0000-000000000000
Guid g4 = Guid.NewGuid();   // g4 is not all zeroes

이것을 int와 같은 일을하는 것과 비교하십시오 :

int i1;                     // i1 is 0
int i2 = new int();         // i2 is 0
int i3 = default(int);      // i3 is 0

1
g1로컬 변수가 아닌 필드로만 컴파일됩니다. 또한 귀하의 코멘트 컬럼의 인덱스는 동일한 코드 라인과 일치하지 않습니다
CodesInChaos

1
@ CodeInChaos : 고마워요, 의견 수정. 참고로, g1 라인은 실제로 컴파일됩니다 ...
JohnD

3
그대로 컴파일되지만 정의 된 값이 없습니다. 코드를 읽는 코드를 추가하면 (쓰기 전에) 더 이상 컴파일되지 않습니다.
코드 InChaos

1
초기화되지 않은 변수를 사용하면 값을 사용할 수 없으므로 오류가 발생합니다.
JohnD

1
"Guid = Guid.NewGuid ();"줄 때문에 다운 투표 새로운 개발자를 혼동시킬 수 있습니다. "Guid someGuid = Guid.NewGuid ();"와 같은 형식으로 편집 해보십시오. g2 라인처럼;)
daviesdoesit


19

이것이 몇 번이나 잡혔는 지 말할 수 없습니다. 나를.

Guid myGuid = Guid.NewGuid(); 

11

완전한 정신으로, 사용하도록 지시하는 대답 Guid.NewGuid()은 정확합니다.

후속 편집을 처리 할 때 RequestObject수업 코드를 게시해야합니다 . 귀하의 guid 속성이로 표시 DataMember되지 않았으므로 와이어를 통해 직렬화되지 않는 것 같습니다. 모든 default(Guid)것과 동일 하기 때문에 , 이것은 당신이보고있는 행동을 설명합니다.new Guid()0

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.