2015-12-09 14 views
39

Ho cercato il codice sorgente di FCL e mi sono confuso che string.Equals() utilizza Object.ReferenceEquals() e Object.ReferenceEquals() utilizza l'operatore == su jugde. E poi non riesco a trovare come è definito l'operatore ==.Dove è definito l'operatore == nella classe "oggetto"?

Quindi, dove è definito l'operatore originale?

+5

Sono piuttosto sicuro della sua parte del linguaggio C# stesso e non parte degli oggetti. – Nahum

+1

è una funzionalità derivata dal linguaggio C#. ** Per impostazione predefinita, l'operatore == verifica l'uguaglianza di riferimento determinando se due riferimenti indicano lo stesso oggetto, quindi i tipi di riferimento non devono implementare l'operatore == per ottenere questa funzionalità. ** - da [msdn] (https : //msdn.microsoft.com/en-US/library/ms173147 (v = vs.80) aspx # ANCHOR_1) –

risposta

26

Questo è un operatore utilizzato dalla lingua per convalidare che due valori sono gli stessi. Quando il codice verrà compilato, questo operatore verrà compilato in modo appropriato in CIL e quindi quando verrà eseguito dal CLR, i due valori verranno confrontati per essere verificati se sono uguali.

Per esempio, questo è il codice CIL per il metodo Main:

Enter image description here

che il compilatore produce per il seguente programma (è un'applicazione console):

class Program 
{ 
    static void Main(string[] args) 
    { 
     int a = 3; 
     int b = 4; 
     bool areEqual = a == b; 
     Console.WriteLine(areEqual); 
    } 
} 

Nota del Linea IL_0007. È stata emessa un'istruzione ceq. Questo è quello che stai cercando, l'operatore ==.

Nota importante

Questo sta accadendo quando il == non sia sovraccarico.

17

Quando non c'è un operatore sovraccaricato == (come qui), il compilatore emette un'istruzione ceq. Non c'è altro codice C# da guardare a questo punto.

Confronta due valori. Se sono uguali, il valore intero 1 (int32) viene inserito nello stack di valutazione; altrimenti 0 (int32) viene inserito nello stack di valutazione.

3

Il sovraccarico di operator== in C# è zucchero sintattico per il richiamo di una funzione statica. La risoluzione di sovraccarico, come tutte le risoluzioni di sovraccarico, si basa sul tipo statico dell'oggetto, non sul tipo dinamico. Diamo un'occhiata a Object.ReferenceEquals ancora:

public static bool ReferenceEquals (Object objA, Object objB) { 
    return objA == objB; 
} 

Qui, il tipo statico di objA e objB è Object. Il tipo dinamico può essere qualsiasi cosa; una stringa, qualche altro tipo definito dall'utente, qualunque sia; non importa. La determinazione di cui viene chiamato lo operator== viene determinata staticamente quando questa funzione viene compilata, in modo da ottenere sempre quella predefinita, non sovraccaricata, incorporata nella lingua. .NET non poteva semplicemente avere un ReferenceEquals e consentire agli utenti di fare ((object)a) == ((object)b), ma avere una funzione specifica per dire cosa sta succedendo migliora la chiarezza.

Object.Equals, d'altra parte, è solo una funzione virtuale. Di conseguenza, la scelta di Equals si basa sul tipo dinamico dell'oggetto a sinistra dello .Equals(, come qualsiasi altra chiamata di funzione virtuale.

4

ceq prende due valori dallo stack e fornisce risultati. Se il valore del risultato è 1, vengono considerati uguali e 0 se non sono uguali.

Tuttavia, l'operatore == non viene sempre tradotto in ceq. Se == in C# risulta in ceq dipende da alcuni altri fattori come are data types primitives o do they have custom == operators o are they references.

Problemi correlati