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


1629

कोड की इस पंक्ति के पार:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

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


50
यह निश्चित रूप से एक टर्नरी ऑपरेटर नहीं है - इसमें केवल दो ऑपरेंड हैं! यह सशर्त ऑपरेटर की तरह एक सा है (जो कि सहायक है ) लेकिन अशक्त coalescing संचालक एक द्विआधारी ऑपरेटर है।
जॉन स्कीट

90
मैंने इसे एक साक्षात्कार में समझाया जहां भावी नियोक्ता ने पहले मेरी सी # क्षमताओं के बारे में संदेह व्यक्त किया था, जैसा कि मैं कुछ समय पहले जावा पेशेवर रूप से उपयोग कर रहा हूं। उन्होंने इसके बारे में पहले नहीं सुना था, और इसके बाद C # के साथ मेरी परिचितता पर सवाल नहीं उठाया :)
जॉन स्कीट

77
@Jon Skeet बीटल्स को ठुकरा देने वाले व्यक्ति के बाद से कौशल को पहचानने में ऐसा महाकाव्य विफल नहीं हुआ है। :-) अब से बस उन्हें अपनी पुस्तक की एक प्रति के साथ एक url लिंक भेजें जो आपके SO प्रोफाइल के अंदर कवर पर लिखा हो।
इयान होल्डर

6
IainMH: क्या यह की कीमत के लिए, मैं नहीं था काफी अभी तक किताब लिखने शुरू कर दिया। (या हो सकता है कि मैं सिर्फ 1 अध्याय पर काम कर रहा था - कुछ ऐसा ही।) मेरे लिए एक खोज ने जल्दी से मेरे ब्लॉग + लेखों को ढूंढ लिया होगा
जॉन स्कीट

7
पुन: q में अंतिम वाक्य - भविष्य के रेफ के लिए, SymbolHound इस तरह की चीज़ के लिए बहुत अच्छा है जैसे कि symbolhound.com/?q=%3F%3F&l=&e=&n=&u= [किसी भी संदिग्ध के लिए - मैं संबद्ध नहीं हूं किसी भी तरह से, बस एक अच्छे उपकरण की तरह जब मैं एक पाता हूं ...]
स्टीव चेम्बर्स

जवाबों:


2153

यह अशक्त सहगामी संचालक है, और काफी टर्निरी (तत्काल-यदि) संचालक की तरह है। यह भी देखें ?? ऑपरेटर - 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 को श्रेय।)


17
संभावित रूप से इन श्रृंखलाओं के लिए खतरनाक हो सकता है
कूपर 4'11

6
@CodeBlend कैसे?
एलसी।

68
@CodeBlend, यह खतरनाक नहीं है। यदि आप विस्तार करना चाहते थे, तो आपके पास बस नेस्टेड की एक श्रृंखला होगी यदि / अन्यथा कथन। वाक्यविन्यास सिर्फ अजीब है क्योंकि आप इसे देखने के लिए अभ्यस्त नहीं हैं।
जोएलमदेव

31
यदि यह खाली तारों के लिए भी काम करता तो यह एक ईश्वर-संदेश होता :) :)
ज़ीफ्रेक्स

14
@Gusdor ??सहयोगी है, इसलिए a ?? b ?? c ?? dइसके बराबर है ((a ?? b) ?? c ) ?? d। "असाइनमेंट ऑपरेटर्स और टर्नरी ऑपरेटर (:) :) सही सहयोगी हैं। अन्य सभी बाइनरी ऑपरेटर्स बाएं सहयोगी हैं।" स्रोत: msdn.microsoft.com/en-us/library/ms173145.aspx
Mark E. Haase

284

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

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

a ?? b ?? c ?? d

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

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


2
मुझे पसंद है कि आपने "नल कोलेसिंग ऑपरेटर" को इसका अर्थ कैसे सरल बनाया। मुझे बस यही चाहिए।
फ्रैंक

2
स्पर्शरेखा लेकिन संबंधित: यह स्विफ्ट में अब है, लेकिन यह बहुत अलग है: "शून्य वालों ऑपरेटर" developer.apple.com/library/ios/documentation/Swift/Conceptual/...
दान Rosenstark

69

यह अशक्त coalescing संचालक है।

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

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

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

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


33
कम से कम अब, इसे खोजना आसान है, भले ही आपको नाम न पता हो, मैं सिर्फ "दोहरा प्रश्न चिह्न c #"
stivlo

27

सभी को धन्यवाद, यहाँ मैं एमएसडीएन साइट पर पाया गया सबसे संक्षिप्त विवरण है:

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

4
यह एक महत्वपूर्ण पहलू पर संकेत देता है ?? ऑपरेटर - इसे अशक्त प्रकारों के साथ काम करने में सहायता के लिए पेश किया गया था। आपके उदाहरण में, "x" टाइप "int?" (Nullable <पूर्णांक>)।
ड्रू नोकें जू

9
@vitule नहीं, यदि null coalescing संचालक का दूसरा संचालक गैर-अशक्त है, तो इसका परिणाम गैर-nullable है (और -1यह केवल एक सादा है int, जो non-nullable है)।
सुजैन डुपरॉन

मैं वास्तव में चाहता हूं कि यह इस तरह से काम करे। मैं यह हर समय करना चाहता हूं, लेकिन मैं नहीं कर सकता क्योंकि मैं जिस चर का उपयोग कर रहा हूं वह एक अशक्त प्रकार नहीं है। कॉफ़ीस्क्रिप्ट y = x में काम करता है? -1
पांडावुड

@ पांडा वास्तव में, आप कर सकते हैं। यदि xप्रकार का है int?, लेकिन yप्रकार का है int, तो आप लिख सकते हैं int y = (int)(x ?? -1)। यह पार्स होगा xएक करने के लिए intअगर यह नहीं है null, या आवंटित -1करने के लिए yकरता है, तो xहै null
जोहान विंटजेंस

21

??वहाँ एक अशक्त प्रकार के लिए एक मूल्य प्रदान करने के लिए जब मूल्य शून्य है। अतः, यदि रूप निरर्थक है, तो यह नया रूप लौटा देगा।


19

यहां छवि विवरण दर्ज करें

दो प्रश्न चिह्न (??) इंगित करते हैं कि इसका एक सह-संचालक है।

कोलेसिंग ऑपरेटर एक चेन से पहला NON-NULL मान लौटाता है। आप इस यूट्यूब वीडियो को देख सकते हैं जो पूरी तरह से व्यावहारिक रूप से प्रदर्शित करता है।

लेकिन मुझे वीडियो जोड़ने के लिए और जोड़ दें।

यदि आप इसे "एक साथ समेकित करते हैं" कहते हैं, तो अंग्रेजी का अर्थ होता है। नीचे दिए गए उदाहरण के लिए, एक सरल तालमेल कोड है जो चार तारों को जोड़ता है।

तो अगर str1है nullयह कोशिश करेंगे str2अगर, str2है nullयह कोशिश करेंगे str3और इसलिए जब तक यह एक गैर-शून्य मान के साथ एक स्ट्रिंग पाता है पर।

string final = str1 ?? str2 ?? str3 ?? str4;

सरल शब्दों में, तालमेल ऑपरेटर एक श्रृंखला से पहला गैर-पूर्ण मान लौटाता है।


मुझे यह स्पष्टीकरण पसंद है क्योंकि इसमें एक आरेख है, और फिर अंतिम वाक्य इसे ऐसे सरल शब्दों में समझाता है! यह उपयोग में मेरे आत्मविश्वास को समझने और बढ़ाने के लिए आसान बनाता है। धन्यवाद!
जोशुआ के

14

यह टर्नरी ऑपरेटर के लिए छोटा हाथ है।

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

या उन लोगों के लिए जो टर्नरी नहीं करते हैं:

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

3
मैंने केवल "टर्नरी" की वर्तनी को ठीक किया है, लेकिन वास्तव में आपके द्वारा मतलब ऑपरेटर सशर्त ऑपरेटर है। यह C # में एकमात्र टर्नेरी ऑपरेटर होता है, लेकिन कुछ बिंदु पर वे एक और जोड़ सकते हैं, जिस बिंदु पर "टर्नरी" अस्पष्ट होगा लेकिन "सशर्त" नहीं होगा।
जॉन स्कीट

यह कुछ है जो आप टर्नरी (सशर्त) ऑपरेटर के साथ कर सकते हैं । आपके लंबे रूप में, परीक्षण ( != null) और दूसरा formsAuth(बाद में ?) दोनों को बदल दिया जा सकता है; अशक्त मोटे रूप में, दोनों आपके द्वारा दिए गए मूल्यों को स्पष्ट रूप से लेते हैं।
बॉब सेमर

12

यदि आप रूबी से परिचित हैं, तो यह मेरे ||=लिए 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";

4
x ||= ydesugars कुछ करने के लिए पसंद है x = x || y, तो ??वास्तव ||में रूबी में सादे के समान है ।
qerub

6
ध्यान दें कि ??केवल परवाह करता है null, जबकि ||रूबी में ऑपरेटर, जैसा कि ज्यादातर भाषाओं में है , या अधिक के बारे nullमें है false, या कुछ भी है जिसे मूल्य के साथ बूलियन माना जा सकता है false(जैसे कुछ भाषाओं में, "")। यह अच्छी या बुरी बात नहीं है, केवल एक अंतर है।
टिम एस

11

coalescing संचालक

इसके बराबर है

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

11

इस बारे में खतरनाक कुछ भी नहीं। वास्तव में, यह सुंदर है। उदाहरण के लिए, यदि वांछित है तो आप डिफ़ॉल्ट मूल्य जोड़ सकते हैं:

कोड

int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;

1
तो X1, x2, x3 और x4 अशक्त प्रकार हो सकते हैं, उदाहरण: int? x1 = null;क्या यह सही है
केविन मेरेडिथ

1
@KevinMeredith x1- x4जरूरी प्रकार के होने चाहिए: यह कहने के लिए कोई मतलब नहीं है, प्रभावी ढंग से, "परिणाम है 0अगर x4यह एक मूल्य है जो यह संभवतः नहीं ले सकता है" ( null)। यहां "अशक्त प्रकार" में अशक्त मूल्य प्रकार और संदर्भ प्रकार दोनों शामिल हैं, निश्चित रूप से। यह एक संकलित समय त्रुटि है यदि एक या अधिक जंजीर चर (पिछले एक को छोड़कर) अशक्त नहीं है।
बॉब सेमर

11

जैसा कि कई उत्तरों में सही ढंग से कहा गया है कि "अशक्त सहकर्मी संचालक" ( ?? ) है, जिसके बारे में आप अपने चचेरे भाई "नल-सशर्त संचालक" (- ? या ? [? ) से जाँच करवाना चाहते हैं। कई बार इसके साथ संयोजन में उपयोग किया जाता है ??

अशक्त-संचालक

एक सदस्य पहुँच ( ? ) या अनुक्रमणिका ( ? ) ऑपरेशन करने से पहले अशक्त के लिए परीक्षण करने के लिए उपयोग किया जाता है। ये ऑपरेटर आपको विशेष रूप से डेटा संरचनाओं में उतरने के लिए अशक्त जांच को संभालने के लिए कम कोड लिखने में मदद करते हैं।

उदाहरण के लिए:

// 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; 

जो अधिक वाचाल और बोझिल है।


10

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

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

वस्तु में:

? anArgument
    ^ self

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

? anArgument
    ^ anArgument

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


एक UserControl पर एक संपत्ति के साथ ViewState को लपेटने जैसा लगता है। पहले प्राप्त करने पर ही आरंभ करें, यदि यह पहले सेट नहीं किया गया है। =)
14

9

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

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

return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();

या

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

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


??शॉर्ट-कट का मूल्यांकन नहीं किया जाता है? new FormsAuthenticationWrapper();मूल्यांकन किया जाता है अगर और केवल अगर _formsAuthWrapper शून्य है।
MSalters

जी हां यह पूरा मामला है। आप केवल विधि को कॉल करना चाहते हैं यदि चर शून्य है। @MSalters
KingOfHypocrites

8

ध्यान दें:

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

जिससे मैं पूरी तरह से समझ गया कि "क्यों इस्तेमाल करना है ?? और कब इस्तेमाल करना है ?? और कैसे इस्तेमाल करना है ??"।

स्रोत:

क्रेग मैकमुर्ट्री आईएसबीएन 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 का मान दिया गया है।


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

1
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

के बराबर है

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

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

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

यह वास्तव में बहुत अच्छा है कि आपने अपने पोस्ट में उदाहरणों को शामिल किया है, हालांकि सवाल यह था कि ऑपरेटर क्या है या क्या करता है, इसका स्पष्टीकरण खोज रहा है।
TGP1994 21

1

??ऑपरेटर अशक्त-वालों ऑपरेटर कहा जाता है। यदि ऑपरेंड शून्य नहीं है, तो यह बाएं हाथ का ऑपरेंड देता है; अन्यथा यह दाहिने हाथ का ऑपरेंड लौटाता है।

int? variable1 = null;
int variable2  = variable1 ?? 100;

variable2के मूल्य पर सेट करें variable1, यदि variable1यह शून्य नहीं है; अन्यथा, यदि variable1 == null, variable2100 पर सेट करें।


0

दूसरों ने Null Coalescing Operatorकाफी अच्छा वर्णन किया है। रुचि रखने वालों के लिए, एक छोटा वाक्यविन्यास है जहाँ यह (SO प्रश्न):

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

इसके बराबर है:

FormsAuth ??= new FormsAuthenticationWrapper();

कुछ इसे अधिक पठनीय और रसीला पाते हैं।

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