2012-03-08 20 views
14

मैं C# में lessthan-operator को अधिभारित कर रहा हूं और मैं सोच रहा हूं कि इसे शून्य की जांच करने की आवश्यकता है या नहीं। नीचे आप एक उदाहरण देख सकते हैं:अधिभार ऑपरेटर की आवश्यकता है <और शून्य जांच

public static bool operator <(MyClass x, MyClass y) 
{ 
    if (x == null && y == null) 
    { 
    return false; 
    } 
    if (x == null) 
    { 
    return true; //false? 
    } 
    if (y == null) 
    { 
    return false; //true? 
    } 
    return x.Value < y.Value; 
} 

या यह सही है:

public static bool operator <(MyClass x, MyClass y) 
{ 
    return x.Value < y.Value; 
} 

मैं इस पर कोई निर्देश खोजने के फ्लॉप। लेकिन शायद मुझे कुछ याद आया।

उत्तर

12

उत्तर आपके इच्छित उपयोग पैटर्न पर निर्भर करता है। यदि आप मिश्रण में नल रखने की योजना बना रहे हैं, और आप null मानों को गैर-शून्य मानों से कम मानना ​​चाहते हैं, तो आपका कार्यान्वयन सही है; यदि आप null मानों को गैर-शून्य वस्तुओं से अधिक मानना ​​चाहते हैं, तो टिप्पणी के बाद वापसी मूल्य (false और true) का उपयोग किया जाना चाहिए। यदि आप मिश्रण में नल को अनुमति देने की योजना नहीं बनाते हैं, तो ArgumentNullException फेंकना या NullReferenceException को सही विकल्प देना होगा।

+1

'ArgumentNullException' बच्चों को फेंक दो, कभी भी एक जानबूझकर' NullReferenceException' फेंक न दें। – Dagrooms

+0

यह "मैं ऐसा करने के लिए मतलब" और "ओह" के बीच का अंतर है।" – Dagrooms

1

एक कस्टम ऑपरेटर एक स्थिर विधि से थोड़ा अधिक है। इसके अलावा, जेनरल्स में ऑपरेटरों को आम तौर पर अपवाद नहीं फेंकना चाहिए। जिसका अर्थ है कि MyClass एक संदर्भ-प्रकार है, तो आपको उन नल-चेक की आवश्यकता है।

वैसे, यह गैर-nulls से कम होने के लिए nulls के लिए पारंपरिक है, जो आपके प्रस्तावित कार्यान्वयन को निष्क्रिय बनाता है।

+0

पहला पैरामीटर शून्य कैसे हो सकता है? – vulkanino

+0

या आप बस सिस्टम को फेंक दें, इसमें कोई नुकसान नहीं है (सिवाय इसके कि अपवाद थोड़ा कम उपयुक्त है)। –

+0

@ vulkanino: ऑपरेटर को स्थैतिक विधि के रूप में कार्यान्वित करने के बाद पहला पैरामीटर शून्य हो सकता है। – Ani

2

व्यक्तिगत तौर पर मैं एक या तो x यदि या yArgumentNullException हैं null है, जो एक असाधारण परिस्थिति होना चाहिए फेंक होगा।

+5

'NullReferenceException' को उपयोगकर्ता कोड से नहीं फेंकना चाहिए, इसका मतलब है कि एक प्रोग्रामिंग बग है। इसके बजाए 'ArgumentNullException' का प्रयोग करें। – asawyer

+0

@asawyer बस संपादित किया गया;) – mdm

+0

@asawyer 'ArgumentNullException' भी एक प्रोग्रामिंग बग इंगित करता है। मुझे यकीन नहीं है कि दोनों ढांचे के इतने स्मार्ट निर्णय थे। –

4

दोनों दृष्टिकोण सही हैं (सही के विभिन्न मूल्यों के लिए)।

यदि x या y शून्य होने की संभावना है और आपके मामले में इसका वैध अर्थ है तो पहले दृष्टिकोण के साथ जाएं।

यदि x और y शून्य होने की संभावना नहीं है तो दूसरे के साथ जाएं और किसी भी अपवाद को संभालने के लिए कॉलिंग कोड को प्रचारित करने दें।

-1
  1. यह एक बुरा विचार वर्गों पर ऑपरेटरों ओवरलोड है। हालांकि यह structs के लिए ठीक है।

  2. यदि आप किसी वर्ग पर ऑपरेटर को अधिभारित करने का निर्णय लेते हैं, तो आपको या तो
    ए होगा। अपने तर्क
    बी में शून्य-जांच शामिल करें।
    सी में शून्य पारित होने पर अपवाद फेंको। रिक्त नहीं की जाँच करें और NullReferenceExceptions (बुरा) के लिए अनुमति

असल में, यह एक बुरा विचार एक वर्ग पर एक ऑपरेटर ओवरलोड है। मैं या तो अपनी कक्षा को एक संरचना में बदल दूंगा, या सिर्फ IComparable<T>/IEquatable<T> जैसे इंटरफ़ेस को कार्यान्वित करूंगा जिसमें दिशाओं में शून्य मानों का उपयोग होने पर दिशानिर्देश हैं।

+0

मैं इससे सहमत नहीं हूं - यह अक्सर मूल्य-समान वर्गों के लिए समझ में आता है, खासकर जब से .NET में प्रासंगिक (उपयोगी) दिशानिर्देश" कहते हैं, "यदि संदेह है, तो कक्षा लिखें"। –

+0

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

+1

मानक उदाहरण: जटिल वर्ग। क्या आप ऑपरेटरों को अधिभारित नहीं करेंगे? – vulkanino

संबंधित मुद्दे