2009-02-27 21 views
15

ये समकक्ष हैं:सी #: शून्य के साथ तुलना

if (null==myobject) 
{ 
//do something 
} 

और

if (myobject==null) 
{ 
//do something 
} 

या वे अलग-अलग कोड उत्पन्न करेंगे?

+10

पहले एक भी योदा condtion के रूप में जाना जाता है :) –

उत्तर

41

99% मामले में यह कोड बराबर है।

एक अपवाद तब होता है जब प्रश्न में ऑब्जेक्ट का प्रकार == ऑपरेटर को ओवरराइड करता है। == में एक बग को पेश करना संभव है जो एक पैरामीटर शून्य होने पर समस्याएं पैदा करता है।

एक विशिष्ट उदाहरण मैं पहले देखा है निम्नलिखित

public static bool operator==(Student left, Student right) { 
    return left.Equals(right); 
} 

यह असफल हो जायेगी जब अशक्त बाईं तरफ है, लेकिन संभावना दांई ओर नहीं जब अशक्त।

हालांकि यह एक बहुत दूर कोने का मामला है।

+0

समाधान है: 'अगर ((ऑब्जेक्ट) बाएं == शून्य) 'या' अगर (संदर्भ एक्वाल्स (बाएं, शून्य)) '। पूर्व शायद अधिक प्रदर्शनकारी है। – yfeldblum

+0

@ जस्टिस, मैंने कभी भी जेआईटी की जांच नहीं की है, लेकिन यदि आप ऑब्जेक्ट करते हैं। संदर्भ समान है, सी # एक विधि कॉल उत्पन्न करेगा। ऑपरेटर की अनुपस्थिति में == सी # आईएल ओपोड सीक के साथ प्रत्यक्ष मूल्य तुलना उत्पन्न करेगा। मेरा अनुमान है कि सीईसी तेज है। – JaredPar

+4

@ जस्टिस, लेकिन प्रदर्शन के बारे में कभी भी कुछ न मानें, प्रोफाइलर पर विश्वास करें :) – JaredPar

9

"if" फ़ॉर्म का रूप जो बाईं ओर स्थिर रखता है वह सी/सी ++ से होल्डओवर है जहां आप किसी कथन में मनमाने ढंग से अभिव्यक्ति कर सकते हैं।

सी # के वाक्यविन्यास के लिए यदि बयानों के लिए अभिव्यक्ति की आवश्यकता है कि अभिव्यक्ति एक बूल का मूल्यांकन करती है जिसका अर्थ है कि if (foo = 0) संकलित नहीं होगा।

+0

ओह अच्छा। मैं कुछ साल पहले याद कर रहा था, जब मैं सी # सीख रहा था, और मैंने शपथ ली थी कि मुझे किसी अन्य कथन में असाइनमेंट (दुर्घटना से) का उपयोग करते समय एक कंपाइलर चेतावनी या त्रुटि मिल रही है, जैसे अन्य सुरक्षा उपकरणों (जैसे कि एक स्विच स्टेटमेंट में लापता ब्रेक)। +1 –

+0

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

+1

@ जैस्मीन: मैं कभी-कभी निर्माण का भी उपयोग करता हूं - आप बस "अगर ((foo = bar()) == nullptr)"। लेकिन आम तौर पर कोड समीक्षा से बच नहीं आता है - यह "foo = bar() में बदल जाता है; अगर (foo == nullptr)" जो क्लीनर IMHO है। –

1

जैसा कि दूसरों द्वारा इंगित किया गया है, वे अधिकतर समकक्ष हैं। http://en.wikipedia.org/wiki/Null_Object_pattern

यह बस एक अशक्त संदर्भ के लिए जाँच करने के लिए एक बहुत ही उपयोगी विकल्प है:

तुम भी पर एक नज़र रखना चाहिए।

6

if (null==myobject) { 

बयान करता है, तो एक लेखन का एक सुरक्षित तरीका है। यह सी/सी ++ से आता है जहां स्थिति एक अभिव्यक्ति है जिसे int पर मूल्यांकन किया गया है। यदि परिणाम शून्य है तो इसका अर्थ है false, और कुछ भी true है। आप

if (variable == 1) { 

की तरह कुछ लिख सकता है लेकिन अगर आप सावधान नहीं थे तुम भी

if (variable = 1) { 

जिस स्थिति में आप एक काम है कि हमेशा 1 पर मूल्यांकन करता है और इस तरह हमेशा सच है लिख सकते हैं।

आप इसे संकलित कर सकते हैं और इसे बिना किसी समस्या के चला सकते हैं, लेकिन नतीजा यह नहीं होगा कि आप क्या उम्मीद करते हैं। तो C/C++ प्रोग्रामर

if (1 == variable) { 

अगर आप इसे गलत लिखा है यह संकलन नहीं होंगे तरह बातें लिखने के लिए, ताकि आप हमेशा यह लिखने के रूप में आप यह लिखने के लिए मतलब था शुरू कर दिया। यह बाद में एक (अच्छी) आदत बन जाती है और उदाहरण के लिए, आप सी # के साथ प्रोग्राम की सभी भाषाओं में इसका उपयोग करते हैं।

2

जो लोग इसे याद आती है, आप अव्यवस्था कम करने के लिए देख रहे हैं की के लिए, यह भी सक्षम करने के लिए संभव है C-language शैली अशक्त की जाँच अपने C# कक्षाओं के लिए:

class MyObj 
{ 
    public void implicit_null_comparison_demo() 
    { 
     MyObj mo = null; 
     // ... 

     if (mo)   // <-- like so (can also use !mo) 
     { 
      // it's not null... 
     } 
     else 
     { 
      // it's null... 
     } 
    } 

    public static implicit operator bool(MyObj mo) 
    { 
     return (Object)mo != null; 
    } 
}; 
संबंधित मुद्दे