?: ?? IF की बजाय ऑपरेटर | ELSE |


85
public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

क्या मैं ?: ??संचालकों का उपयोग इफ़ेक्ट के रूप में कर सकता / सकती हूँ ?


मेरा सवाल:
निम्नलिखित के साथ कैसे लिखें ?: ?? ऑपरेटरों

[१]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[२]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

संक्षेप में : कुछ भी नहीं करने के लिए, कुछ भी नहीं लौटाएं और ?: ??ऑपरेटर के साथ कई निर्देश दें ?


1
यह हालांकि एक ही व्यवहार नहीं करेगा। सशर्त का उपयोग नहीं करके यदि / और शाखा, आप बिना शर्त (और अनावश्यक रूप से) चर का उपयोग करने के लिए हर बार जब आप इसे एक्सेस करते हैं। यह बहुत जल्दी खराब हो सकता है, खासकर यदि आपके पास बहु-थ्रेडेड कोड है। बस यह मत करो।
जेफ मर्काडो

1
यदि स्रोत की प्रॉपर्टी एक्सेसर स्रोत की प्रॉपर्टी (उसके एक्सेस एक्सेसर) को वापस कर रही है, तो आपके पास एक अंतहीन / पुनरावर्ती कॉल होगा।
जॉन के

1
आपके पहले कोड स्निपेट में एक संपत्ति पाने वाला होता है जो अपने स्वयं के सेटर को कॉल करता है , जो बदले में अपने स्वयं के गेट्टर को पुन: कॉल करता है । आपने मुझे वहां खो दिया, क्योंकि ऐसा कोई रास्ता नहीं है जो संभवतः क्षेत्र में काम करेगा। कृपया अपने प्रश्न को परिष्कृत करें और बताएं कि आप क्या हासिल करना चाहते हैं।
फ्रैडरिक हमीदी

कुछ नहीं लौटाया? वह वीबी है। आप यहाँ c # लिख रहे हैं।
टास्क

@ तास्क का मतलब है कि ऐसा कैसे किया जाए, यह पंक्ति इस प्रश्न के लिए एक टिप्पणी है
अहमद गोनिम

जवाबों:


198

[1] के लिए, आप ऐसा नहीं कर सकते: इन ऑपरेटरों को एक मूल्य वापस करने के लिए बनाया गया है, ऑपरेशन नहीं।

भाव

a ? b : c

करने के लिए मूल्यांकन करता bहै, तो aसच है और करने के लिए मूल्यांकन करता cहै, तो aगलत है।

भाव

b ?? c

मूल्यांकन करने के लिए bअगर bअशक्त नहीं है और मूल्यांकन करता है cकि bक्या अशक्त है।

अगर आप लिखेंगे

return a ? b : c;

या

return b ?? c;

वे हमेशा कुछ वापस करेंगे ।

[2] के लिए, आप एक फ़ंक्शन लिख सकते हैं जो सही मूल्य देता है जो आपके "कई ऑपरेशन" करता है, लेकिन यह शायद सिर्फ उपयोग करने से भी बदतर है if/else


41

टर्नेरी ऑपरेटर ( ?:) नियंत्रण प्रवाह के लिए डिज़ाइन नहीं किया गया है , यह केवल सशर्त असाइनमेंट के लिए डिज़ाइन किया गया है । यदि आपको अपने कार्यक्रम के प्रवाह को नियंत्रित करने की आवश्यकता है, तो नियंत्रण संरचना का उपयोग करें, जैसे if/ else


5
मैं जोड़ूंगा कि मैंने देखा है कि लोगों ने / या के स्थान पर नेस्टेड टर्नरी अभिव्यक्तियों का उपयोग किया है और यह कोड का उत्पादन करता है जो पढ़ना मुश्किल है, और डिबग है। चारों तरफ़ ख़राब मोजो।
ckramer

4
कभी-कभी नेस्टेड टर्नरी ऑपरेटर अधिक पठनीय कोड का उत्पादन करते हैं, अगर व्हाट्सएप का उपयोग ठीक से किया जाता है।
सच्चाई

2
@ ट्रैक: हाँ, मेरे पास ?:प्रति नेस्टेड के खिलाफ कुछ भी नहीं है। लेकिन मुझे उनके साथ एक बड़ी समस्या है जिसका उपयोग नियंत्रण प्रवाह और विशेष रूप से नेस्टेड नियंत्रण प्रवाह के लिए किया जा रहा है !
ओलिवर चार्ल्सवर्थ

11

करने के लिए संदर्भित: ऑपरेटर (C # संदर्भ)

सशर्त ऑपरेटर (:) एक बूलियन अभिव्यक्ति के मूल्य के आधार पर दो में से एक मान लौटाता है। सशर्त ऑपरेटर के लिए सिंटैक्स निम्नलिखित है।

करने के लिए संदर्भित ? ऑपरेटर (C # संदर्भ)

?? ऑपरेटर को null-coalescing ऑपरेटर कहा जाता है और इसका उपयोग एक अशक्त मान प्रकार के साथ-साथ संदर्भ प्रकारों के लिए डिफ़ॉल्ट मान को परिभाषित करने के लिए किया जाता है। यदि यह शून्य नहीं है, तो यह बाएं हाथ का ऑपरेंड लौटाता है; अन्यथा यह सही ऑपरेंड देता है।

इसका मत:

[भाग 1]

return source ?? String.Empty;

[भाग २] लागू नहीं है ...


3
वह कुछ नहीं करने से अलग है। यह एक खाली स्ट्रिंग देता है।
सच्चाई

1
यकीन है, लेकिन यह नहीं है कि ओपी के लिए क्या पूछा। जो कुछ भी - यह मेरी गलती है कि ओ पी करने के लिए "वापसी कुछ नहीं" नहीं कहा है कि संभवतः हो सकता है।
सच्चाई

1
@ प्रवृत्ति: किसी भी शरीर ने यह नहीं कहा कि यह आपकी गलती है .. हालाँकि, ओपी कुछ भी नहीं लौटाना चाहता था और जो मैंने प्रदान किया है।
अकरम शाहदा

3

"कुछ भी नहीं" वास्तव में काम नहीं करता है?

अगर // रिटर्न नथिंग से आपका मतलब है कि वास्तव में रिटर्न अशक्त है तो लिखें

return Source;

यदि आपका मतलब कोडपैड को अनदेखा करना है तो लिखें

 if ( Source != null )
            {
                return Source;
            }
// source is null so continue on.

और आखिरी के लिए

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.

3

टर्नेरी ऑपरेटर RETURNS दो मूल्यों में से एक है। या, यह अपनी स्थिति के आधार पर दो बयानों में से एक को निष्पादित कर सकता है, लेकिन यह आमतौर पर एक अच्छा विचार नहीं है, क्योंकि इससे अनपेक्षित दुष्प्रभाव हो सकते हैं।

bar ? () : baz();

इस मामले में, (ए) कुछ नहीं करता है, जबकि बाज कुछ करता है। लेकिन आपने केवल कोड को कम स्पष्ट किया है। मैं और अधिक वर्बोस कोड के लिए जाना चाहता हूं जो स्पष्ट और बनाए रखने में आसान है।

इसके अलावा, यह थोड़ा समझ में आता है:

var foo = bar ? () : baz();

चूंकि () का कोई रिटर्न प्रकार नहीं है (यह शून्य है) और बाज का रिटर्न प्रकार है जो इस नमूने में कॉल के बिंदु पर अज्ञात है। यदि वे सहमत नहीं हैं, तो कंपाइलर शिकायत करेगा, और जोर से।


2

यदि आप अपने कोड की वाचालता से चिंतित हैं तो मैं अभिव्यक्ति का दुरुपयोग करने के बजाय यह लिखूंगा।

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");

मैं अभिव्यक्ति का दुरुपयोग नहीं कर रहा हूँ, मैं सिर्फ सोच रहा हूँ!
अहमद गोनिम

1

।?: यात्रा कार्यक्रम ऑपरेटर है। (मेरा मानना ​​है कि मैंने ठीक से वर्तनी की है) और इसका उपयोग करना सरल है। के रूप में एक बूलियन विधेय में? iftrue: ifalse; लेकिन आपके पास एक प्रतिद्वंद्विता / अंतराल होना चाहिए जैसा कि प्रचलन = भविष्यवाणी में है? iftrue: iffalse;

भूतपूर्व int i = x < 7 ? x : 7;

यदि x 7 से कम था, तो मुझे x सौंपा जाएगा, यदि नहीं तो मैं 7 होगा।

आप इसे एक वापसी में भी उपयोग कर सकते हैं, जैसे कि return x < 7 ? x : 7;

फिर से, जैसा कि ऊपर, यह एक ही प्रभाव होगा।

इसलिए, Source = Source == value ? Source : string.Empty;मुझे विश्वास है कि आपका क्या प्रयास है।


6
मुझें यह पसंद है। यात्रा कार्यक्रम ऑपरेटर : यह आपकी मदद करता है एक से सेल्सियस के लिए बी करने के लिए एक से मिलता है ... या ... ए के आधार पर
रिक Sladkey

हां, उसका मतलब है टर्नरी। लेकिन सही नाम "सशर्त" है।
एरिक जी। हागस्ट्रॉम

1

?:ऑपरेटर एक बूलियन अभिव्यक्ति के मूल्य के आधार पर दो में से एक मान देता है।

Condition-Expression ? Expression1 : Expression2

?:ऑपरेटर के बारे में और अधिक जानकारी प्राप्त करें , इसे टर्नरी ऑपरेटर के रूप में भी जानें:


0

मुझे नहीं लगता कि आप एक ऑपरेटर और इसके एक या दूसरे को वापस करने के लिए मान सकते हैं। यह नहीं है अगर और बयान प्रतिस्थापन हालांकि यह कुछ मामले पर उस के लिए इस्तेमाल किया जा सकता है।

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