गाइड सभी 0 (शून्य) है?


241

मैं कुछ WCF सेवाओं का परीक्षण कर रहा हूँ जो आगे और पीछे की वस्तुओं को भेजती हैं। मेरे वेब ऐप परीक्षण कोड में, मैं निम्नलिखित कर रहा हूं:

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

किसी कारण से, नए गाइड () के लिए कॉल सभी 0 (शून्य) के साथ इस तरह से गाइड उत्पन्न कर रहा है:

00000000-0000-0000-0000-000000000000

ऐसा किसके कारण हो सकता है?


9
आपके संपादन के बाद, यह एक बिल्कुल नया प्रश्न है। और नए उत्तर को निर्धारित करने के लिए एक पूरी बहुत अधिक जानकारी की आवश्यकता है।
स्कॉट रिपी

3
संपादित भाग को हटा दिया जिसने प्रश्न को बदल दिया।
डिडैक्सिस

115
+1 क्योंकि मैंने इस प्रश्न का उपयोग एक खाली
गाइड को

5
@ जोसम्समैन, फॉर्म का उपयोग करना बेहतर हैGuid.Empty
जोनाथन मोसेकियन

4
@JonathanM मैं वास्तव में इसे SQL स्क्रिप्ट में उपयोग कर रहा हूं। यह पोस्ट सिर्फ सर्च करने के बाद सबसे पहले दिखाई देती है।
jmosesman

जवाबों:


428

Guid.NewGuid()डिफ़ॉल्ट कंस्ट्रक्टर को कॉल करने के बजाय स्थिर विधि का उपयोग करें ।

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

18
सही उत्तर के लिए +1 और साथ ही उचित दस्तावेज़ के लिंक के लिए।
२०:०२ पर ऑब्स्क्योररोबोट

109

इससे सीखने के लिए सबक:

1) गाइड एक वैल्यू टाइप है, रेफरेंस टाइप नहीं।

2) डिफॉल्ट कंस्ट्रक्टर new S()को किसी भी वैल्यू टाइप पर कॉल करना हमेशा आपको उस वैल्यू टाइप के ऑल-जीरो फॉर्म को वापस कर देता है, चाहे वह कुछ भी हो। यह तार्किक रूप से उसी के समान है default(S)


3
क्या यह उसी IL में संकलित होता है default(S)या क्या कोई सूक्ष्मता है जो मुझे याद आ रही है?
विन्यासकर्ता

8
@configurator: यह करता है। वास्तव में, "डिफ़ॉल्ट (एस)" ​​और "नए एस ()" के कंपाइलर आंतरिक प्रतिनिधित्व समान हैं; हम उन्हें आंतरिक रूप से अलग नहीं करते हैं, जिसके कारण वर्षों में कुछ दुर्भाग्यपूर्ण कीड़े हो गए हैं क्योंकि वे वास्तव में काफी समान नहीं हैं। उदाहरण के लिए, const int x = new int();अनुमान के अनुसार कानूनी नहीं माना जाता है, लेकिन const int x = default(int);है; हम दोनों को अनुमति देते हैं।
एरिक लिपर्ट

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 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 i1;                     // i1 is 0
int i2 = new int();         // i2 is 0
int i3 = default(int);      // i3 is 0

1
g1केवल फ़ील्ड के रूप में संकलित करेगा और स्थानीय चर के रूप में नहीं। इसके अलावा अपने टिप्पणी स्तंभ में सूचकांक कोड की एक ही पंक्ति के साथ मेल नहीं खाते
CodesInChaos

1
@CodeInChaos: धन्यवाद, टिप्पणी तय की। FYI करें, g1 लाइन वास्तव में संकलन करती है ...
JohnD

3
यह जैसा है वैसा ही संकलित करेगा, लेकिन इसका कोई परिभाषित मूल्य नहीं है। यदि आप उस कोड को जोड़ते हैं जो इसे पढ़ता है (इसे लिखने से पहले) यह अब संकलित नहीं करेगा।
कोडइन्चोसोस

1
सही, अच्छी बात है, अगर आप एक असिंचित चर का उपयोग करते हैं, तो आपको एक त्रुटि मिलेगी, इसलिए मूल्य का उपयोग नहीं किया जा सकता है।
जॉनडी

1
डाउन-वोटेड क्योंकि लाइन "गाइड = गाइड.न्यूजीयुड ();" नए डेवलपर्स को भ्रमित कर सकते हैं। "गाइड someGuid = Guide.NewGuid ();" G2 लाइन की तरह;)
daviesdoesit

25

करने की कोशिश करो:

Guid foo = Guid.NewGuid();

1
डाउनवोट का कारण: "गाइड" एक प्रकार है लेकिन इसका उपयोग एक चर की तरह किया जाता है।
daviesdoesit

19

आपको बता नहीं सकता कि यह कितनी बार पकड़ा गया है। मुझे।

Guid myGuid = Guid.NewGuid(); 

11

पूर्ण होने की भावना में, आपके द्वारा उपयोग Guid.NewGuid()किए जाने वाले उत्तर सही हैं।

अपने बाद के संपादन को संबोधित करने में, आपको अपनी RequestObjectकक्षा के लिए कोड पोस्ट करना होगा । मुझे संदेह है कि आपकी गाइड प्रॉपर्टी को ए के रूप में चिह्नित नहीं किया गया है DataMember, और इस तरह तार पर अनुक्रमित नहीं किया जा रहा है। चूंकि default(Guid)यह new Guid()(यानी सभी 0के) समान है, यह आपके द्वारा देखे जा रहे व्यवहार को स्पष्ट करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.