2011-12-27 12 views
9

मैं अपनी कक्षाओं में से एक में IComparable और IComprable<T> लागू कर रहा हूं। क्या कोई सिफारिश है कि प्रत्येक मामले में CompareTo विधि को शून्य तर्क देने पर व्यवहार करना चाहिए? क्या इसे सकारात्मक संख्या वापस करनी चाहिए या ArgumentNullException फेंकना चाहिए? या क्या यह व्यवहार कार्यान्वयन वर्ग के आधार पर भिन्न हो सकता है?शून्य तर्कों के लिए असंभव व्यवहार

मैंने एमएसडीएन दस्तावेज (here और here) देखा लेकिन इसका इस विषय पर कुछ भी कहना नहीं है। किसी भी तरह की सहायता को आभार समझेंगे।

उत्तर

9

IComparable.CompareTo() और IComparable<T>.CompareTo() राज्य के लिए दोनों MSDN संदर्भ निम्नलिखित:

परिभाषा के अनुसार, किसी भी वस्तु से अधिक तुलना (या इस प्रकार) Nothing, और दो अशक्त संदर्भ एक दूसरे के बराबर की तुलना करें।

VB में Nothing सी # में null से मेल खाती है।

ध्यान दें कि पिछले पैराग्राफ कहता है:

तुलना के अर्थ, "कम से कम," "के बराबर है," और "से अधिक है," विशेष रूप से कार्यान्वयन पर निर्भर करता है।

लेकिन उदाहरण संदर्भ जो शून्य नहीं हैं, वे हमेशा शून्य संदर्भों से अधिक होते हैं, इससे कोई फर्क नहीं पड़ता कि आप अपनी कक्षा के उदाहरणों की तुलना कैसे करते हैं।

12

मैं MSDN प्रलेखीकरण देखा था, लेकिन यह इस विषय

हाँ यह करता है पर कुछ नहीं कहना है, लेकिन बहुत स्पष्ट रूप से नहीं। दस्तावेज़ीकरण में कहा गया है:

परिभाषा के अनुसार, कोई वस्तु कुछ भी (या निम्नानुसार) से तुलना नहीं करती है, और दो शून्य संदर्भ एक-दूसरे के बराबर तुलना करते हैं।

दस्तावेज़ीकरण भ्रमित है क्योंकि यह उसी वाक्य में सी # (शून्य) और वीबी (कुछ भी नहीं) से मुहावरे को मिलाता है। मैं इसे दस्तावेज प्रबंधक के बारे में बताऊंगा।

ध्यान दें कि एक ही नियम शून्य मूल्यों पर लागू होता है। यदि आप निरर्थक पूर्णांक की एक सूची को सॉर्ट कर रहे हैं, तो कहें, तो सॉर्टिंग के उद्देश्यों के लिए 1 को शून्य से अधिक माना जाता है। सावधान रहे; यह नहीं है कि कैसे nullable integers डिफ़ॉल्ट रूप से सी # में तुलना करते हैं।

+0

ध्यान दें कि यदि आप http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx पृष्ठ पर सिंटेक्स के अंतर्गत C# टैब पर क्लिक करते हैं, तो पाठ पढ़ने के लिए बदल जाता है "... तुलना शून्य (या निम्न) से अधिक, और दो शून्य संदर्भ ... " – phoog

+0

@phoog: अच्छा! मैंने यह नहीं देखा था। –

5

ऑब्जेक्ट का उपयोग करना सुनिश्चित करें। संदर्भ यह जांचने के लिए कि तुलनात्मक को पास किया गया तर्क शून्य है या नहीं। तुलनात्मक तरीकों में == और! = ऑपरेटर का उपयोग करने से बचें क्योंकि कोई वास्तव में एमएसडीएन सुझाव का पालन कर सकता है ताकि उन ऑपरेटरों को तुलनात्मक विधि में वापस भेज दिया जा सके, जो बदले में एक आंख की झपकी में अनंत लूप और स्टैक ओवरफ्लो (!) बनायेगा।

public class Piano : IComparable<Piano> 
{ 

    public float Mark { get; set; } 

    public int CompareTo(Piano other) 
    { 
     // The very basic implementation of CompareTo 

     if (object.ReferenceEquals(other, null)) 
      return 1; // All instances are greater than null 

     return Mark.CompareTo(other.Mark); 

    } 

} 

this पते पर स्पष्टीकरण के साथ पूरे स्रोत कोड:

यहाँ एक मॉडल है कि कैसे आप compareTo विधि को लागू करने की कोशिश कर सकते है।