Guid tüm 0'lar (sıfırlar) mı?


241

Kılavuzları olan nesneleri ileri geri gönderen bazı WCF hizmetlerini test ediyorum. Web uygulaması test kodumda aşağıdakileri yapıyorum:

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

Bazı nedenlerden dolayı, yeni Guid () çağrısı, tüm 0'larla (sıfırlar) aşağıdaki gibi Rehberler oluşturur:

00000000-0000-0000-0000-000000000000

Buna ne sebep olabilir?


9
Düzenlemenizden sonra, bu tamamen yeni bir soru. Ve yeni cevabı belirlemek için çok daha fazla bilgiye ihtiyaç var.
Scott Rippey

3
Soruyu değiştiren düzenlenmiş bölüm kaldırıldı.
Didaxis

115
+1 çünkü bu soruyu bir düzine kez boş bir
rehber

5
@jmosesman, formu kullanmak daha iyiGuid.Empty
Jonathan Moosekian

4
@JonathanM Aslında bir SQL komut dosyasında kullanıyorum. Bu gönderi sadece aramanın ardından ilk ortaya çıkıyor.
jmosesman

Yanıtlar:


428

Guid.NewGuid()Varsayılan yapıcıyı çağırmak yerine statik yöntemi kullanın.

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

18
Doğru yanıt için +1 ve doğru belgelere bağlantı.
ObscureRobot

109

Bundan öğrenilecek dersler:

1) Guid, bir referans tipi değil, bir değer türüdür.

2) new S()Herhangi bir değer türünde varsayılan kurucuyu çağırmak , her ne olursa olsun, bu değer türünün sıfır biçimini her zaman geri verir. Mantıksal olarak aynı default(S).


3
Aynı IL'de default(S)derleniyor mu yoksa eksik olduğum incelikler var mı?
yapılandırıcı

8
@configurator: Öyle. Aslında, derleyicinin "varsayılan (S)" ve "yeni S ()" iç temsili aynıdır; Onları dahili olarak ayırt etmiyoruz, bu da yıllar boyunca bazı talihsiz hatalara yol açtı, çünkü aslında tam olarak aynı değiller . Örneğin const int x = new int();, spesifikasyona göre yasal olması beklenmemektedir const int x = default(int);; ikisine de izin veriyoruz.
Eric Lippert

1
@configurator - ilgili köşe vakalarıyla ilgileniyorsanız, belki de msmvps.com/blogs/jon_skeet/archive/2008/12/10/… da ilginizi çekebilir .
kvb

56

Bunun yerine şunu deneyin:

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

Bu 'gerçek' bir Guid değeri üretir. Bir başvuru türünü yeni oluşturduğunuzda, size varsayılan değeri verecektir (bu durumda, bir Kılavuz için tümü sıfırdır).

Yeni bir Guid oluşturduğunuzda, Guid'in varsayılan değeri olan tüm sıfırlara sıfırlar. Temel olarak "yeni" bir int oluşturmakla aynıdır (bu bir değer türüdür ancak bunu yine de yapabilirsiniz):

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

Bunu int ile aynı şeyi yapmakla karşılaştırın:

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

1
g1yerel değişken olarak değil, yalnızca alan olarak derlenir. Ayrıca yorum sütunundaki indeksler kodun aynı satırıyla
eşleşmiyor

1
@CodeInChaos: Teşekkürler, yorumları düzeltti. FYI, g1 hattı aslında derleniyor ...
JohnD

3
Olduğu gibi derlenir, ancak tanımlanmış bir değeri yoktur. (Bunu yazmadan önce) okuyan bir kod eklerseniz, artık derlenmez.
CodesInChaos

1
Doğru, iyi bir nokta, başlatılmamış bir değişken kullanırsanız bir hata alırsınız, bu nedenle değer kullanılamaz.
JohnD

1
"Guid = Guid.NewGuid ();" satırı için aşağı oy verildi yeni geliştiricileri karıştırabilir. "Guid someGuid = Guid.NewGuid ();" gibi bir şeyi düzenlemeyi düşünün g2 hattı gibi;)
daviesdoesit


19

Bunun kaç kez yakalandığını söyleyemem. ben mi.

Guid myGuid = Guid.NewGuid(); 

11

Tam olma ruhuyla, size talimat veren cevaplar Guid.NewGuid()doğrudur.

Sonraki düzenlemenizi ele alırken, RequestObjectsınıfınıza ilişkin kodu yayınlamanız gerekir . Guid özelliğinizin a olarak işaretlenmediğinden DataMemberve bu nedenle tel üzerinden serileştirilmediğinden şüpheleniyorum . Yana default(Guid)aynıdır new Guid()(yani tüm 0's), bu davranışı sen gören açıklıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.