c# - सी#में दो प्रश्न चिह्नों का क्या अर्थ है?




null-coalescing-operator (11)

ध्यान दें:

मैंने इस धागे और कई अन्य लोगों को पढ़ा है, लेकिन मुझे यह बिल्कुल सही जवाब नहीं मिल रहा है।

जिसके द्वारा मैं पूरी तरह से समझता हूं कि क्यों उपयोग करें ?? और कब उपयोग करें ?? और कैसे उपयोग करें ?? "

स्रोत:

विंडोज संचार नींव क्रेग मैकमुर्ट्री द्वारा आईएसबीएन 0-672-32948-4 द्वारा छोड़ा गया

शून्य मूल्य प्रकार

ऐसी दो सामान्य परिस्थितियां हैं जिनमें कोई यह जानना चाहेगा कि मूल्य को किसी प्रकार के उदाहरण के लिए असाइन किया गया है या नहीं। पहला तब होता है जब आवृत्ति डेटाबेस में एक मान का प्रतिनिधित्व करती है। ऐसे मामले में, कोई यह सुनिश्चित करने के लिए उदाहरण की जांच कर सकता है कि डेटाबेस में मूल्य वास्तव में मौजूद है या नहीं। दूसरी परिस्थिति, जो इस पुस्तक के विषय वस्तु से अधिक प्रासंगिक है, वह तब होता है जब आवृत्ति कुछ दूरस्थ स्रोत से प्राप्त डेटा आइटम का प्रतिनिधित्व करती है। फिर, कोई उदाहरण से यह निर्धारित करना चाहेगा कि उस डेटा आइटम का मूल्य प्राप्त हुआ था या नहीं।

.NET Framework 2.0 में एक सामान्य प्रकार की परिभाषा शामिल होती है जो इस तरह के मामलों को प्रदान करती है जिसमें कोई मूल्य प्रकार के उदाहरण के लिए शून्य निर्दिष्ट करना चाहता है, और परीक्षण करें कि उदाहरण का मान शून्य है या नहीं। वह जेनेरिक टाइप परिभाषा System.Nullable है, जो सामान्य प्रकार के तर्कों को बाधित करती है जिन्हें टी के मान प्रकारों के लिए प्रतिस्थापित किया जा सकता है। System.Nullable से बनाए गए प्रकारों के उदाहरणों को शून्य का मान असाइन किया जा सकता है; वास्तव में, उनके मूल्य डिफ़ॉल्ट रूप से शून्य हैं। इस प्रकार, System.Nullable से निर्मित प्रकारों को शून्य मान प्रकार के रूप में संदर्भित किया जा सकता है। System.Nullable में एक प्रॉपर्टी, वैल्यू है, जिसके द्वारा बनाए गए प्रकार के उदाहरण को आवंटित मान प्राप्त किया जा सकता है यदि इंस्टेंस का मान शून्य नहीं है। इसलिए, कोई लिख सकता है:

System.Nullable<int> myNullableInteger = null;
myNullableInteger = 1;
if (myNullableInteger != null)
{
Console.WriteLine(myNullableInteger.Value);
}

सी # प्रोग्रामिंग भाषा System.Nullable से निर्मित प्रकारों को घोषित करने के लिए एक संक्षिप्त वाक्यविन्यास प्रदान करती है। वह वाक्यविन्यास एक को संक्षिप्त करने की अनुमति देता है:

System.Nullable<int> myNullableInteger;

सेवा मेरे

int? myNullableInteger;

कंपाइलर किसी को एक सामान्य मूल्य प्रकार के मान को इस प्रकार से सामान्य मान प्रकार में असाइन करने का प्रयास करने से रोक देगा:

int? myNullableInteger = null;
int myInteger = myNullableInteger;

यह किसी को ऐसा करने से रोकता है क्योंकि शून्य करने योग्य मान प्रकार में मूल्य शून्य हो सकती है, जो वास्तव में इस मामले में होती है, और वह मान सामान्य मान प्रकार को असाइन नहीं किया जा सकता है। हालांकि संकलक इस कोड को अनुमति देगा,

int? myNullableInteger = null;
int myInteger = myNullableInteger.Value;

दूसरा कथन एक अपवाद को फेंकने का कारण बनता है क्योंकि System.Nullable.Value प्रॉपर्टी का उपयोग करने का कोई भी प्रयास एक अमान्य ऑपरेशन है यदि सिस्टम से बनाया गया प्रकार। टुलबल को टी का वैध मान असाइन नहीं किया गया है, जो इस में नहीं हुआ है मामला।

निष्कर्ष:

एक सामान्य मूल्य प्रकार के लिए एक शून्य मान प्रकार के मान को असाइन करने का एक उचित तरीका System.Nullable.HasValue प्रॉपर्टी का उपयोग यह पता लगाने के लिए है कि टी का वैध मान शून्य प्रकार के मान को असाइन किया गया है या नहीं:

int? myNullableInteger = null;
if (myNullableInteger.HasValue)
{
int myInteger = myNullableInteger.Value;
}

एक और विकल्प इस वाक्यविन्यास का उपयोग करना है:

int? myNullableInteger = null;
int myInteger = myNullableInteger ?? -1;

जिसके द्वारा सामान्य पूर्णांक myInteger को nullable पूर्णांक "myNullableInteger" का मान असाइन किया गया है यदि बाद वाले को वैध पूर्णांक मान असाइन किया गया हो; अन्यथा, myInteger को -1 का मान सौंपा गया है।

कोड की इस पंक्ति में दौड़ें:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

दो प्रश्न चिह्नों का क्या अर्थ है, क्या यह किसी प्रकार का टर्नरी ऑपरेटर है? Google में देखना मुश्किल है।


coalescing ऑपरेटर

यह बराबर है

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth

केवल आपके मनोरंजन के लिए (जानते हुए कि आप सभी सी # लोग हैं ;-)।

मुझे लगता है कि यह स्मॉलटाक में पैदा हुआ, जहां यह कई सालों से आसपास रहा है। इसे वहां परिभाषित किया गया है:

वस्तु में:

? anArgument
    ^ self

UndefinedObject में (उर्फ शून्य की कक्षा):

? anArgument
    ^ anArgument

इसके मूल्यांकन (?) और गैर-मूल्यांकन संस्करण (??) दोनों हैं।
यह अक्सर आलसी-प्रारंभिक निजी (उदाहरण) चर के लिए गेटटर-विधियों में पाया जाता है, जो वास्तव में आवश्यक होने तक शून्य छोड़ दिया जाता है।


कोलेसेसिंग का उपयोग करके मूल्य प्राप्त करने के कुछ उदाहरण अक्षम हैं।

आप वास्तव में क्या चाहते हैं:

return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();

या

return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());

यह ऑब्जेक्ट को हर बार पुनर्निर्मित होने से रोकता है। निजी वैरिएबल शेष नल और प्रत्येक अनुरोध पर एक नई ऑब्जेक्ट बनने के बजाय, यह सुनिश्चित करता है कि नया ऑब्जेक्ट बनाया गया है तो निजी चर असाइन किया गया है।


यदि आप रूबी से परिचित हैं, तो इसका ||= सी # के समान लगता है ?? मेरे लिए। यहां कुछ रूबी है:

irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"

और सी # में:

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";

यह एक शून्य coalescing ऑपरेटर है जो एक टर्नरी ऑपरेटर के समान काम करता है।

    a ?? b  => a !=null ? a : b 

इसके लिए एक और दिलचस्प बिंदु यह है कि, "एक शून्य प्रकार में एक मान हो सकता है, या इसे अपरिभाषित किया जा सकता है" । तो यदि आप एक गैर-शून्य मान प्रकार को एक शून्य मान प्रकार असाइन करने का प्रयास करते हैं तो आपको संकलन-समय त्रुटि मिल जाएगी।

int? x = null; // x is nullable value type
int z = 0; // z is non-nullable value type
z = x; // compile error will be there.

तो ऐसा करने के लिए ?? ऑपरेटर:

z = x ?? 1; // with ?? operator there are no issues

यह नल कोलेसिंग ऑपरेटर है, और टर्नरी (तत्काल-अगर) ऑपरेटर की तरह है। यह भी देखें ?? ऑपरेटर - एमएसडीएन

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

विस्तारित करता है:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

जो आगे बढ़ता है:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

अंग्रेजी में, इसका मतलब है "यदि बाएं जो कुछ भी है, वह शून्य नहीं है, तो इसका उपयोग करें, अन्यथा सही तरीके से उपयोग करें।"

ध्यान दें कि आप अनुक्रम में इनमें से किसी भी संख्या का उपयोग कर सकते हैं। निम्नलिखित कथन Answer# लिए पहले गैर-शून्य Answer# को असाइन करेगा (यदि सभी उत्तर शून्य हैं तो Answer शून्य है):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

इसके अलावा उल्लेखनीय है कि उपरोक्त विस्तार वैचारिक रूप से समतुल्य है, प्रत्येक अभिव्यक्ति का परिणाम केवल एक बार मूल्यांकन किया जाता है। यह महत्वपूर्ण है यदि उदाहरण के लिए एक अभिव्यक्ति साइड इफेक्ट्स के साथ एक विधि कॉल है। (इसे इंगित करने के लिए @ जॉय को क्रेडिट।)


यह शून्य coalescing ऑपरेटर है।

http://msdn.microsoft.com/en-us/library/ms173224.aspx

हां, खोजना लगभग असंभव है जब तक आपको पता न हो कि इसे क्या कहा जाता है! :-)

संपादित करें: और यह एक और सवाल से एक अच्छी सुविधा है। आप उन्हें चेन कर सकते हैं।

सी # की छिपी हुई विशेषताएं?


सिर्फ इसलिए कि किसी और ने जादू शब्द अभी तक नहीं कहा है: यह शून्य सहकर्मी ऑपरेटर है । यह सी # 3.0 भाषा विनिर्देश के खंड 7.12 में परिभाषित किया गया है

यह बहुत आसान है, विशेष रूप से जिस तरह से यह काम करता है जब यह अभिव्यक्ति में कई बार उपयोग किया जाता है। फॉर्म की एक अभिव्यक्ति:

a ?? b ?? c ?? d

अभिव्यक्ति का परिणाम a अगर यह गैर-शून्य है, अन्यथा b कोशिश करें, अन्यथा कोशिश करें, अन्यथा कोशिश करें d । यह हर बिंदु पर शॉर्ट सर्किट।

इसके अलावा, यदि d का प्रकार गैर-शून्य है, तो संपूर्ण अभिव्यक्ति का प्रकार भी गैर-शून्य है।


?? मान शून्य होने पर एक शून्य प्रकार के लिए एक मूल्य प्रदान करने के लिए है? इसलिए, यदि फॉर्मअथ शून्य है, तो यह नए फॉर्म लौटाएगा प्रमाणीकरणवापर ()।


FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

के बराबर है

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

लेकिन इसके बारे में अच्छी बात यह है कि आप उन्हें चेन कर सकते हैं, जैसे अन्य लोगों ने कहा। एक पतला स्पर्श नहीं है कि आप वास्तव में अपवाद फेंकने के लिए इसका उपयोग कर सकते हैं।

A = A ?? B ?? throw new Exception("A and B are both NULL");




null-coalescing-operator