कोड की इस पंक्ति के पार:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
दो प्रश्न चिह्नों का क्या मतलब है, क्या यह किसी प्रकार का टर्नरी ऑपरेटर है? Google में देखना कठिन है।
कोड की इस पंक्ति के पार:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
दो प्रश्न चिह्नों का क्या मतलब है, क्या यह किसी प्रकार का टर्नरी ऑपरेटर है? Google में देखना कठिन है।
जवाबों:
यह अशक्त सहगामी संचालक है, और काफी टर्निरी (तत्काल-यदि) संचालक की तरह है। यह भी देखें ?? ऑपरेटर - MSDN ।
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;
यह भी ध्यान देने योग्य है, जबकि ऊपर विस्तार वैचारिक रूप से समतुल्य है, प्रत्येक अभिव्यक्ति का परिणाम केवल एक बार मूल्यांकन किया जाता है। यह महत्वपूर्ण है अगर उदाहरण के लिए एक अभिव्यक्ति साइड इफेक्ट्स के साथ एक विधि कॉल है। (इसे इंगित करने के लिए @Joey को श्रेय।)
??
सहयोगी है, इसलिए a ?? b ?? c ?? d
इसके बराबर है ((a ?? b) ?? c ) ?? d
। "असाइनमेंट ऑपरेटर्स और टर्नरी ऑपरेटर (:) :) सही सहयोगी हैं। अन्य सभी बाइनरी ऑपरेटर्स बाएं सहयोगी हैं।" स्रोत: msdn.microsoft.com/en-us/library/ms173145.aspx
सिर्फ इसलिए कि किसी और ने जादू के शब्दों को अभी तक नहीं कहा है: यह अशक्त सह-संचालक है । यह C # 3.0 भाषा विनिर्देश के खंड 7.12 में परिभाषित किया गया है ।
यह बहुत उपयोगी है, खासकर जब यह एक अभिव्यक्ति में कई बार उपयोग किए जाने के तरीके के कारण होता है। फार्म की एक अभिव्यक्ति:
a ?? b ?? c ?? d
a
यदि यह गैर-अशक्त है, तो अभिव्यक्ति का परिणाम देगा , अन्यथा प्रयास करें b
, अन्यथा प्रयास करें c
, अन्यथा प्रयास करें d
। यह हर बिंदु पर शॉर्ट-सर्किट करता है।
इसके अलावा, यदि प्रकार d
गैर-अशक्त है, तो पूरी अभिव्यक्ति का प्रकार भी अशक्त है।
यह अशक्त coalescing संचालक है।
http://msdn.microsoft.com/en-us/library/ms173224.aspx
हाँ, लगभग असंभव को खोजने के लिए जब तक आप नहीं जानते कि इसे क्या कहा जाता है! :-)
EDIT: और यह एक और सवाल का एक अच्छा फीचर है। आप उन्हें चेन कर सकते हैं।
सभी को धन्यवाद, यहाँ मैं एमएसडीएन साइट पर पाया गया सबसे संक्षिप्त विवरण है:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
-1
यह केवल एक सादा है int
, जो non-nullable है)।
x
प्रकार का है int?
, लेकिन y
प्रकार का है int
, तो आप लिख सकते हैं int y = (int)(x ?? -1)
। यह पार्स होगा x
एक करने के लिए int
अगर यह नहीं है null
, या आवंटित -1
करने के लिए y
करता है, तो x
है null
।
दो प्रश्न चिह्न (??) इंगित करते हैं कि इसका एक सह-संचालक है।
कोलेसिंग ऑपरेटर एक चेन से पहला NON-NULL मान लौटाता है। आप इस यूट्यूब वीडियो को देख सकते हैं जो पूरी तरह से व्यावहारिक रूप से प्रदर्शित करता है।
लेकिन मुझे वीडियो जोड़ने के लिए और जोड़ दें।
यदि आप इसे "एक साथ समेकित करते हैं" कहते हैं, तो अंग्रेजी का अर्थ होता है। नीचे दिए गए उदाहरण के लिए, एक सरल तालमेल कोड है जो चार तारों को जोड़ता है।
तो अगर str1
है null
यह कोशिश करेंगे str2
अगर, str2
है null
यह कोशिश करेंगे str3
और इसलिए जब तक यह एक गैर-शून्य मान के साथ एक स्ट्रिंग पाता है पर।
string final = str1 ?? str2 ?? str3 ?? str4;
सरल शब्दों में, तालमेल ऑपरेटर एक श्रृंखला से पहला गैर-पूर्ण मान लौटाता है।
यह टर्नरी ऑपरेटर के लिए छोटा हाथ है।
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
या उन लोगों के लिए जो टर्नरी नहीं करते हैं:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
!= null
) और दूसरा formsAuth
(बाद में ?
) दोनों को बदल दिया जा सकता है; अशक्त मोटे रूप में, दोनों आपके द्वारा दिए गए मूल्यों को स्पष्ट रूप से लेते हैं।
यदि आप रूबी से परिचित हैं, तो यह मेरे ||=
लिए C # के समान प्रतीत होता है ??
। यहाँ कुछ रूबी है:
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"
और C # में:
string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";
x ||= y
desugars कुछ करने के लिए पसंद है x = x || y
, तो ??
वास्तव ||
में रूबी में सादे के समान है ।
??
केवल परवाह करता है null
, जबकि ||
रूबी में ऑपरेटर, जैसा कि ज्यादातर भाषाओं में है , या अधिक के बारे null
में है false
, या कुछ भी है जिसे मूल्य के साथ बूलियन माना जा सकता है false
(जैसे कुछ भाषाओं में, ""
)। यह अच्छी या बुरी बात नहीं है, केवल एक अंतर है।
इस बारे में खतरनाक कुछ भी नहीं। वास्तव में, यह सुंदर है। उदाहरण के लिए, यदि वांछित है तो आप डिफ़ॉल्ट मूल्य जोड़ सकते हैं:
कोड
int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;
int? x1 = null;
क्या यह सही है
x1
- x4
जरूरी प्रकार के होने चाहिए: यह कहने के लिए कोई मतलब नहीं है, प्रभावी ढंग से, "परिणाम है 0
अगर x4
यह एक मूल्य है जो यह संभवतः नहीं ले सकता है" ( null
)। यहां "अशक्त प्रकार" में अशक्त मूल्य प्रकार और संदर्भ प्रकार दोनों शामिल हैं, निश्चित रूप से। यह एक संकलित समय त्रुटि है यदि एक या अधिक जंजीर चर (पिछले एक को छोड़कर) अशक्त नहीं है।
जैसा कि कई उत्तरों में सही ढंग से कहा गया है कि "अशक्त सहकर्मी संचालक" ( ?? ) है, जिसके बारे में आप अपने चचेरे भाई "नल-सशर्त संचालक" (- ? या ? [? ) से जाँच करवाना चाहते हैं। कई बार इसके साथ संयोजन में उपयोग किया जाता है ??
एक सदस्य पहुँच ( ? ) या अनुक्रमणिका ( ? ) ऑपरेशन करने से पहले अशक्त के लिए परीक्षण करने के लिए उपयोग किया जाता है। ये ऑपरेटर आपको विशेष रूप से डेटा संरचनाओं में उतरने के लिए अशक्त जांच को संभालने के लिए कम कोड लिखने में मदद करते हैं।
उदाहरण के लिए:
// if 'customers' or 'Order' property or 'Price' property is null,
// dollarAmount will be 0
// otherwise dollarAmount will be equal to 'customers.Order.Price'
int dollarAmount = customers?.Order?.Price ?? 0;
बिना पुराने तरीका ? और ?? यह करने का है
int dollarAmount = customers != null
&& customers.Order!=null
&& customers.Order.Price!=null
? customers.Order.Price : 0;
जो अधिक वाचाल और बोझिल है।
केवल आपके मनोरंजन के लिए (आप सभी C # लोग हैं ;-)
मुझे लगता है कि इसकी शुरुआत स्मालटाक में हुई, जहां यह कई सालों से है। इसे इस प्रकार परिभाषित किया गया है:
वस्तु में:
? anArgument
^ self
UndefinedObject में (उर्फ नील की कक्षा):
? anArgument
^ anArgument
इसमें मूल्यांकन (?) और गैर-मूल्यांकन संस्करण (??) दोनों हैं।
यह अक्सर आलसी-आरंभिक निजी (उदाहरण) चर के लिए गेट्टर-विधियों में पाया जाता है, जो वास्तव में आवश्यक होने तक शून्य छोड़ दिए जाते हैं।
यहाँ कुछ उदाहरण हैं जो तालमेल का उपयोग करके मूल्यों को प्राप्त करने में अक्षम हैं।
आप वास्तव में क्या चाहते हैं:
return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();
या
return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());
यह हर बार ऑब्जेक्ट को दोबारा बनाए जाने से रोकता है। निजी चर शेष शून्य और प्रत्येक अनुरोध पर बनाई जा रही एक नई वस्तु के बजाय, यह सुनिश्चित करता है कि यदि नई वस्तु बनाई गई है तो निजी चर को सौंपा गया है।
??
शॉर्ट-कट का मूल्यांकन नहीं किया जाता है? new FormsAuthenticationWrapper();
मूल्यांकन किया जाता है अगर और केवल अगर _formsAuthWrapper
शून्य है।
मैंने इस पूरे धागे को और कई अन्य लोगों को पढ़ा है, लेकिन मुझे इस बारे में पूरी तरह से जवाब नहीं मिला।
जिससे मैं पूरी तरह से समझ गया कि "क्यों इस्तेमाल करना है ?? और कब इस्तेमाल करना है ?? और कैसे इस्तेमाल करना है ??"।
क्रेग मैकमुर्ट्री आईएसबीएन 0-672-32948-4 द्वारा प्राप्त विंडोज संचार नींव
ऐसी दो सामान्य परिस्थितियाँ हैं, जिनमें कोई जानना चाहेगा कि क्या एक मान एक प्रकार के मान को सौंपा गया है। पहला है जब उदाहरण किसी डेटाबेस में एक मान का प्रतिनिधित्व करता है। ऐसे मामले में, कोई यह जानने के लिए उदाहरण का परीक्षण करने में सक्षम होना चाहेगा कि क्या वास्तव में डेटाबेस में कोई मूल्य मौजूद है। दूसरी परिस्थिति, जो इस पुस्तक के विषय से अधिक प्रासंगिक है, जब उदाहरण किसी दूरस्थ स्रोत से प्राप्त डेटा आइटम का प्रतिनिधित्व करता है। फिर, कोई उदाहरण से निर्धारित करना चाहेगा कि क्या उस डेटा आइटम के लिए एक मूल्य प्राप्त हुआ था।
.NET फ्रेमवर्क 2.0 एक सामान्य प्रकार की परिभाषा को शामिल करता है जो इस तरह के मामलों के लिए प्रदान करता है जिसमें कोई एक मान प्रकार के उदाहरण के लिए अशक्त असाइन करना चाहता है, और परीक्षण करता है कि क्या उदाहरण का मान शून्य है। वह सामान्य प्रकार की परिभाषा System.Nullable है, जो सामान्य प्रकार के तर्कों को कसती है जिन्हें T से मान प्रकारों के लिए प्रतिस्थापित किया जा सकता है। System.Nullable से निर्मित प्रकारों के उदाहरणों को शून्य मान दिया जा सकता है; वास्तव में, उनके मूल्य डिफ़ॉल्ट रूप से शून्य हैं। इस प्रकार, System.Nullable से निर्मित प्रकारों को अशक्त मान प्रकार के रूप में संदर्भित किया जा सकता है। System.Nullable के पास एक संपत्ति, मूल्य है, जिसके द्वारा निर्मित प्रकार के एक उदाहरण को निर्दिष्ट मूल्य प्राप्त किया जा सकता है यदि उदाहरण का मान शून्य नहीं है। इसलिए, कोई भी लिख सकता है:
System.Nullable<int> myNullableInteger = null;
myNullableInteger = 1;
if (myNullableInteger != null)
{
Console.WriteLine(myNullableInteger.Value);
}
C # प्रोग्रामिंग भाषा 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 से निर्मित प्रकार को T का एक वैध मान नहीं सौंपा गया है, जो इसमें नहीं हुआ है मामला।
एक अशक्त मान प्रकार के मान को एक साधारण मान प्रकार में निर्दिष्ट करने का एक उचित तरीका है System.Nullable.HasValue संपत्ति का उपयोग यह पता लगाने के लिए कि क्या T का एक वैध मान अशक्त मान प्रकार को सौंपा गया है:
int? myNullableInteger = null;
if (myNullableInteger.HasValue)
{
int myInteger = myNullableInteger.Value;
}
एक अन्य विकल्प इस सिंटैक्स का उपयोग करना है:
int? myNullableInteger = null;
int myInteger = myNullableInteger ?? -1;
जिसके द्वारा साधारण पूर्णांक myInteger को nullable पूर्णांक "myNullableInteger" का मान असाइन किया जाता है यदि उत्तरार्द्ध को एक वैध पूर्णांक मान सौंपा गया है; अन्यथा, myInteger को -1 का मान दिया गया है।
यह एक अशक्त सह-संचालक है जो एक टर्नरी ऑपरेटर के समान काम करता है।
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();
लेकिन इसके बारे में अच्छी बात यह है कि आप उन्हें चेन कर सकते हैं, जैसे अन्य लोगों ने कहा। एक पतली को नहीं छुआ है कि आप वास्तव में इसका इस्तेमाल अपवाद फेंकने के लिए कर सकते हैं।
A = A ?? B ?? throw new Exception("A and B are both NULL");
??
ऑपरेटर अशक्त-वालों ऑपरेटर कहा जाता है। यदि ऑपरेंड शून्य नहीं है, तो यह बाएं हाथ का ऑपरेंड देता है; अन्यथा यह दाहिने हाथ का ऑपरेंड लौटाता है।
int? variable1 = null;
int variable2 = variable1 ?? 100;
variable2
के मूल्य पर सेट करें variable1
, यदि variable1
यह शून्य नहीं है; अन्यथा, यदि variable1 == null
, variable2
100 पर सेट करें।
दूसरों ने Null Coalescing Operator
काफी अच्छा वर्णन किया है। रुचि रखने वालों के लिए, एक छोटा वाक्यविन्यास है जहाँ यह (SO प्रश्न):
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
इसके बराबर है:
FormsAuth ??= new FormsAuthenticationWrapper();
कुछ इसे अधिक पठनीय और रसीला पाते हैं।