2010-09-16 12 views
5

मुझे सी # में एक अजीब "असममितता" से मारा गया है कि मैं वास्तव में समझ में नहीं आता हूं। निम्नलिखित कोड देखें:ऑब्जेक्ट। एक्वाल्स वर्चुअल है, लेकिन ऑब्जेक्ट.ऑपरेटर == इसका उपयोग सी # में नहीं करता है?

using System; 
using System.Diagnostics; 
namespace EqualsExperiment 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      object apple = "apple"; 
      object orange = string.Format("{0}{1}", "ap", "ple"); 
      Console.WriteLine("1"); 
      Debug.Assert(apple.Equals(orange)); 
      Console.WriteLine("2"); 
      Debug.Assert(apple == orange); 
      Console.WriteLine("3"); 
     } 
    } 
} 

यह आपके लिए .NET गुरुओं के लिए स्पष्ट हो सकता है, लेकिन दूसरा दावा विफल हो जाता है।

जावा में मैंने सीखा है कि == ऑब्जेक्ट नामक कुछ के लिए समानार्थी है। संदर्भ यहां। सी # में, मैंने सोचा कि ऑब्जेक्ट.ऑपरेटर == ऑब्जेक्ट.इक्वाल्स का उपयोग करता है, जो वर्चुअल है, इसलिए यह सिस्टम में है। स्ट्रिंग क्लास।

क्या कोई समझा सकता है, दूसरा दावा सी # में विफल क्यों होता है? मेरी कौन सी धारणाएं खराब हैं?

+0

मुझे अपने प्रश्न में एक [उत्तर] (http://stackoverflow.com/questions/1766492/c-overloading-operator-versus-equals/1849288#1849288) भी मिला है। ऐसा लगता है कि 'object.operator ==' 'ऑब्जेक्ट का उपयोग करता है। संदर्भ Equals', लेकिन' string.operator == '' object.Equals' का उपयोग करता है। यह मेरे लिए प्रतिद्वंद्वी है, क्योंकि 'object.Equals' वर्चुअल है, इसलिए इसे पहले से 'object.operator =='' में उपयोग किया जा सकता है। – wigy

उत्तर

7

== ऑपरेटर समानार्थी नहीं है, यह एक ऑपरेटर है जो विभिन्न प्रकारों के लिए परिभाषित किया गया है।

== ऑपरेटर स्ट्रिंग्स के लिए परिभाषित किया गया है, और फिर यह वास्तव में Equals विधि का उपयोग करता है:

public static bool operator ==(string a, string b) { 
    return Equals(a, b); 
} 

हालांकि, अपने कोड में आप तार, आप वस्तुओं पर प्रयोग कर रहे हैं पर ऑपरेटर का उपयोग नहीं कर रहे हैं, तो आपको क्या मिलता है == ऑपरेटर ऑब्जेक्ट्स के लिए परिभाषित किया गया है, जो तुलना करने के लिए ReferenceEquals का उपयोग करता है।

ऑपरेटर का उपयोग करने के लिए ऑपरेटर का कौन सा अधिभार संकलन समय पर तय किया जाता है, इसलिए यह वेरिएबल का प्रकार है जो अधिभार का निर्णय लेता है, न कि वेरिएबल्स को इंगित करने वाले ऑब्जेक्ट्स का वास्तविक प्रकार।

+0

हम्म। तो आप कहते हैं कि ऑब्जेक्ट.ऑपरेटर == को संदर्भ एक्वाल्स के साथ परिभाषित किया गया है, जबकि स्ट्रिंग.ऑपरेटर == को बराबर के साथ परिभाषित किया गया है। क्या वह अच्छा और सहज नहीं है? – wigy

+1

@wigy: अधिकांश समय यह बहुत अच्छी तरह से काम करता है, लेकिन निश्चित रूप से आपके उदाहरण की तरह स्थितियां हैं जहां आप रनटाइम पर तुलना निर्धारित करने की अपेक्षा कर सकते हैं। यह निश्चित रूप से सी ++ और जावा में उदाहरण के मुकाबले अधिक सहज है, जहां आप स्ट्रिंग पर == ऑपरेटर का विश्वसनीय रूप से उपयोग नहीं कर सकते हैं। वीबी में = ऑपरेटर रनटाइम पर तुलना निर्धारित करता है, जो कि वीबी कैसे काम करता है इसके अनुरूप है, लेकिन इससे कई अन्य स्थितियां मिलती हैं जहां यह आपको आश्चर्यचकित कर सकती है। सी # में कोड से निर्धारित करना संभव है कि वास्तव में किस तुलना का उपयोग किया जाएगा, जो सी # सामान्य रूप से कैसे काम करता है इसके अनुरूप है। – Guffa

+0

धन्यवाद गुफा। मुझे पता है कि यह सी, जावा या वीबी से बेहतर है। सी ++ ऑपरेटर आभासी हो सकते हैं, इसलिए आपके पास अलग-अलग समस्याएं हैं।यही कारण है कि अधिकांश सी ++ कोडिंग मानकों ने योड-स्थितियों का उपयोग किया है जैसे 'अगर (5 == कुछ) {...}' आपके उत्तर से मुझे समझ में आया कि ढांचे के डिजाइनरों ने सोचा था कि संदर्भकल्स कुछ कोडर के लिए अधिक सहज है, लेकिन निश्चित स्ट्रिंग दूसरी ओर। ऑपरेटर ==। – wigy

6

ऑपरेटरों को स्थैतिक तरीकों के रूप में परिभाषित किया जाता है, इसलिए वे बहुरूपता में भाग नहीं ले सकते हैं। तो आपका दूसरा दावा == की परिभाषा object के लिए परिभाषा का उपयोग करता है (क्योंकि आपके चर object के रूप में घोषित किए जाते हैं), जो केवल संदर्भ समानता का परीक्षण करता है। यदि चर string के रूप में घोषित किए गए थे, तो ==string के लिए अधिभार का उपयोग किया गया होगा, और दूसरा जोर सफल होगा।

+2

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

+0

मैं समझता हूं कि मैं 'स्थिर बूल ऑब्जेक्ट.ऑपरेटर == (ऑब्जेक्ट, ऑब्जेक्ट) 'का उपयोग करता हूं। लेकिन मुझे अभी भी समझ में नहीं आता है, वह ऑब्जेक्ट। एक्वाल्स (ऑब्जेक्ट) 'क्यों नहीं कहता है। चूंकि यह आभासी है, इसलिए सही 'स्ट्रिंग.क्वाल्स (ऑब्जेक्ट)' को अंत में बुलाया जाएगा। – wigy