2011-05-05 6 views
10

मैं निम्नलिखित कोड को देखा,सी # - यह आवश्यक जाँच कर रहा है "व्यक्ति && obj है obj = अशक्त!"

public override bool Equals(object obj) 
{ 
    // From the book http://www.amazon.co.uk/Pro-2010-NET-4-0-Platform/dp/1430225491 
    // Page 254! 
    if (obj is Person && obj != null) 
... 
} 

मेरी समझ के आधार पर, मुझे लगता है कि इस प्रकार कोड फिर से लिखा जाना चाहिए:

public override bool Equals(object obj) 
{ 
    if (obj is Person) 
... 
} 

क्या यह सही है?

http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx

पर एक अभिव्यक्ति है के आधार सही का आकलन करता है, तो प्रदान की अभिव्यक्ति में गैर-शून्य है, और प्रदान की वस्तु के कारण एक अपवाद फेंका जा करने के लिए बिना प्रदान की प्रकार के डाली जा सकती है।

मुझे लगता है कि शून्य के लिए अतिरिक्त जांच बिल्कुल आवश्यक नहीं है। दूसरे शब्दों में, वह कोड "obj! = Null" कभी भी हिट नहीं होना चाहिए।

धन्यवाद

// अद्यतन //

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Employee 
    { 
     public static void CheckIsEmployee(object obj) 
     { 
      if (obj is Employee) 
      { 
       Console.WriteLine("this is an employee"); 
      } 
      else if (obj == null) 
      { 
       Console.WriteLine("this is null"); 
      } 
      else 
      { 
       Console.WriteLine("this is Not an employee"); 
      } 
     } 
    } 

    class NotEmployee 
    { } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Employee e = new Employee(); 

      Employee.CheckIsEmployee(e); 

      Employee f = null; 
      Employee.CheckIsEmployee(f); 

      NotEmployee g = new NotEmployee(); 
      Employee.CheckIsEmployee(g); 
     } 
    } 
} 

आउटपुट परिणाम:

this is an employee 
this is null 
this is Not an employee 

उत्तर

8

मेरी प्राथमिकता as कीवर्ड का उपयोग करना होगा।

public override bool Equals(object obj) 
{ 
    var objectToCompare = obj as Person; 
    if (objectToCompare == null) 
     return false; 
    ... 
} 

लाभ यह है कि बाद में विधि में, जिसके द्वारा आप अपनी तुलना करने के लिए एक टाइप उदाहरण (objectToCompare) है।

आप अपने मूल्यांकन में सही हैं कि obj is Person झूठी वापसी करेगा यदि ओबीजे व्यक्ति से नहीं लिया गया है या यदि ओबीजे शून्य है और इस प्रकार obj is Person && obj != null अनावश्यक है; यदि आप उस शैली का उपयोग कर रहे हैं तो आपको केवल obj is Person की आवश्यकता है। तकनीकी रूप से, पहले शून्य की जांच करके एक आंशिक प्रदर्शन लाभ हो सकता है, लेकिन लाभ नगण्य होगा।

+0

इस बात पर निर्भर करता है कि 'is' की परिभाषा क्या है ;-) .NET के मामले में,' as' आंतरिक रूप से 'है' करता है और परिणाम 'शून्य' होने पर 'शून्य' पर सेट करता है। यदि कभी-कभी 'शून्य' की अपेक्षा की जा सकती है तो jlew का समाधान अधिक इष्टतम होता है। –

+0

@ एरिक जे: डी। 'As' का उपयोग करने का कारण मुख्य रूप से बाद में टाइप किए गए उदाहरण का उपयोग करना है। इसलिए, 'jlew' के समाधान में, आप (संभवतः) को' व्यक्ति 'के रूप में' ओब्जे 'के रूप में डालने की आवश्यकता होगी, यह निर्धारित करने के बाद कि यह शून्य नहीं था ताकि आप शेष बराबर मूल्यांकन कर सकें। एक ही परिणाम के लिए कोड या दो कोड बचाता है। – Thomas

1

आपका संस्करण मेरे लिए अधिक सही लग रहा है। यह एक व्यक्ति नहीं होगा जब तक कि यह शून्य न हो, तो obj! = Null अनावश्यक है।

8

कार्यात्मक रूप से यह सही है, लेकिन रनटाइम प्रकार की जांच करने की तुलना में शून्य की जांच करना तेज़ है, इसलिए आप अधिकतर स्थितियों में पहले शून्य की जांच करना बेहतर कर रहे हैं। इस तरह, यदि obj शून्य है, तो रनटाइम प्रकार की जांच का ओवरहेड नहीं किया जाएगा।

+0

कृपया मेरी अपडेट की गई पोस्ट देखें। – q0987

+2

@ q0987, ठीक है, मैंने अभी एक त्वरित प्रदर्शन परीक्षण किया है और यह अनिवार्य रूप से एक ही प्रदर्शन के रूप में बाहर निकलता है। या तो ऑपरेशन प्रति सेकेंड लाखों बार किया जा सकता है, इसलिए शायद प्रदर्शन दृष्टिकोण से चिंता करने योग्य नहीं है। – jlew

1

किसी व्यक्ति का संदर्भ अभी भी एक शून्य संदर्भ हो सकता है, इसलिए तकनीकी रूप से हाँ, दोनों चेक की आवश्यकता है।

मुझे थॉमस का जवाब पसंद है कि दोनों चेक एक साथ कैसे संभालें। null as MyClass == null, और myClassInstance as OtherClass == null, इसलिए सुरक्षित रूप से कास्ट ऑब्जेक्ट की एक जांच के साथ आपने दोनों स्थितियों की पुष्टि की है, और जैसा कि उन्होंने कहा था, तब से आपके पास काम करने के लिए दृढ़ता से टाइप किया गया संदर्भ है।

is और as कीवर्ड संचालन के बीच निम्न स्तर पर अंतर की एक दिलचस्प चर्चा है। Google "जैसा है या जैसा है" (मुझे वर्तमान में इंटरनेट समस्या है)। यह पता चला है कि वे आईएल स्तर पर बहुत समान काम करते हैं।

+1

+1 मुझे देखने के लिए "जैसा है या जैसा है" देखने के लिए। http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx?PageIndex=2#comments – Thomas

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