2015-06-12 9 views
7

मैंने .NET Framework में GUID प्रकार के सॉस कोड में देखा है कि Equals के कार्यान्वयन और == ऑपरेटर बहुत समान कोड निष्पादित करता है।क्यों == कार्यान्वयन कॉल GUID के बराबर नहीं है?

== ऑपरेटर फ़र्ट्स तर्क पर समान विधि क्यों नहीं कहता है? कुछ इस तरह:

public static bool operator ==(Guid a, Guid b) 
{ 
    return a.Equals(b); 
} 
+3

वोट-आधारित के रूप में बंद करने के लिए वोटिंग, हम ढांचे डिजाइनरों/डेवलपर्स दिमाग को नहीं पढ़ सकते हैं। – BradleyDotNET

+0

मुझे लगता है कि आदिम बनाम ऑब्जेक्ट के मुद्दों के कारण – nafas

+1

मेरा अनुमान होगा कि ऑपरेटर कार्यान्वयन ढांचे के लिए 'IEquatable' के अतिरिक्त से पहले मौजूद था। जब इसे जोड़ा गया, तो उन्होंने इसे फिर से लिखने के बजाय ऑपरेटर कोड को डुप्लिकेट करना चुना (शायद पुराने कोड को बदलने से बचने की नीति?) यह शुद्ध अटकलें है, हालांकि। अधिक आक्रामक इनलाइनिंग के लिए एक बेहद मामूली अनुकूलन विचार भी हो सकता है, लेकिन इस मामले में कोड पुनरावृत्ति के लिए मुझे विशेष रूप से सार्थक कारण के रूप में नहीं मारा जाएगा। या यह सिर्फ एक गलती थी और कोड समीक्षा में कोई भी नहीं सोचा था कि यह ठीक करने के प्रयास के लायक होने के लिए काफी बुरा था। –

उत्तर

5

टिप्पणी बहुत कह रहा है:

public static bool operator ==(Guid a, Guid b) 
{ 
    // Now compare each of the elements 

यह अपने आप में कोई मतलब नहीं है। फ़ाइल में कहीं उस टिप्पणी के लिए खोज रहे:

public bool Equals(Guid g) 
{ 
    // Now compare each of the elements 

लेकिन यह भी

// Returns true if and only if the guid represented 
// by o is the same as this instance. 
public override bool Equals(Object o) 
{ 
    Guid g; 
    // Check that o is a Guid first 
    if(o == null || !(o is Guid)) 
     return false; 
    else g = (Guid) o; 

    // Now compare each of the elements 

टिप्पणी केवल कि पिछले विधि में समझ में आता है। यह एक बहुत ही मजबूत संकेत है कि Guid.Equals(Object) कार्यान्वयन पहले आया था।

यह कम से कम उप इष्टतम, अगर Guid.operator == और Guid.Equals(Guid)Guid.Equals(Object) के शीर्ष पर लागू किया गया, कि पिछले पद्धति के रूप में व्यर्थ आवंटन की आवश्यकता है बुरा हो सकता है, या, और जब यह शायद ही, आम मामलों में ध्यान देने योग्य हो जाएगा वहाँ निश्चित रूप से Guid तुलना है जो तंग loops में कुछ कोड में होती है जहां आवंटन मापने योग्य होगा।

अब, operator ==Equals(Guid) का उपयोग करना संभवतः होगा, या इसके विपरीत, लेकिन यह वास्तव में एक बार के बजाय इसे दो बार कॉपी और पेस्ट करने के लिए कोई अतिरिक्त काम नहीं है।

+1

बदले में टिप्पणियों की तरह, "पहली बार यह एक GUID है" की तरह, ऐसा लगता है कि यह शायद एक नए डेवलपर द्वारा लागू किया गया था, जो शायद DRY प्रिंसिपल से परिचित नहीं हो सकता है :) –

+2

@YuvalItzchakov यह भी कि 'o = = null' अनावश्यक है: यदि 'o == null', तो'! (o guid है) 'जरूरी है कि सच है। – hvd

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