40 votes

Où l'opérateur == est-il défini dans la classe "objet" ?

J'ai cherché le code source de FCL et je me suis trompé en disant que string.Equals() utilise Object.ReferenceEquals() et Object.ReferenceEquals() utilise == opérateur à jugde. Et puis je n'arrive pas à trouver comment l == est défini.

Alors, où est défini l'opérateur original ?

27voto

Christos Points 11296

C'est un opérateur que le langage utilise pour valider que deux valeurs sont identiques. Lorsque votre code sera compilé, cet opérateur sera compilé de manière appropriée dans le CIL et ensuite, lorsque nous serons exécutés par le CLR, les deux valeurs seront comparées pour être vérifiées si elles sont identiques.

Par exemple, il s'agit du code CIL pour les Main méthode :

Enter image description here

que le compilateur produit pour le programme suivant (c'est une application console) :

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

Notez la ligne IL_0007. Il y a un ceq a été émise. C'est ce que vous recherchez, le == opérateur.

Note importante

Cela se produit lorsque le == n'est pas surchargé.

17voto

Damien_The_Unbeliever Points 102139

Quand il n'y a pas de surcharge == (comme ici), le compilateur émet un message de type ceq l'instruction. Il n'y a plus de code C# à regarder à ce stade.

Compare deux valeurs. Si elles sont égales, la valeur entière 1 (int32) est poussée sur la pile d'évaluation ; sinon, 0 (int32) est poussé sur la pile d'évaluation.

4voto

Rahul Nikate Points 2792

ceq prend deux valeurs de la pile et donne les résultats. Si la valeur du résultat est 1, alors elles sont considérées comme égales et 0 si elles ne sont pas égales.

Cependant, le == n'est pas toujours traduit en ceq . Que ce soit == en C# donne comme résultat ceq dépend d'autres facteurs comme are data types primitives ou do they have custom == operators ou are they references .

3voto

Billy ONeal Points 50631

Surcharge de travail operator== en C# est un sucre syntaxique pour appeler une fonction statique. La résolution des surcharges, comme toutes les résolutions de surcharges, se fait sur la base de l'attribut type statique de l'objet, et non du type dynamique. Prenons l'exemple de Object.ReferenceEquals encore :

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

Ici, le type statique de objA et objB est Object . Le type dynamique peut être n'importe quoi ; une chaîne de caractères, un autre type défini par l'utilisateur, n'importe quoi ; cela n'a pas d'importance. La détermination du type operator== est appelé est déterminé statiquement lorsque cette fonction est compilée, de sorte que vous obtenez toujours la fonction par défaut, non surchargée, fournie par le langage intégré. .NET pourrait simplement ne pas avoir de ReferenceEquals et laisser les utilisateurs faire ((object)a) == ((object)b) mais le fait d'avoir une fonction spécifique nommée pour dire ce qui se passe améliore la clarté.

Object.Equals par contre, n'est qu'une fonction virtuelle. Par conséquent, qui Equals est choisi est basé sur le type dynamique de l'objet à gauche de l'objet .Equals( comme tout autre appel de fonction virtuelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X