2010-06-14 5 views
3

À moins qu'une classe remplace spécifiquement le comportement défini pour Object, ReferenceEquals and == do the same thing ... compare les références.! (ReferenceEquals()) vs! = Dans Entity Framework 4

En setters de propriété, j'ai souvent utilisé le modèle

private MyType myProperty; 

public MyType MyProperty 
{ 
    set 
    { 
     if (myProperty != value) 
     { 
      myProperty = value; 
      // Do stuff like NotifyPropertyChanged 
     } 
    } 
} 

Cependant, dans le code généré par Entity Framework, la déclaration if est remplacé par

if (!ReferenceEquals(myProperty, value)) 

L'utilisation ReferenceEquals est plus explicite (comme Je suppose que tous les programmeurs C# ne savent pas que == fait la même chose si elle n'est pas surchargée).

Y a-t-il une différence qui m'échappe entre les deux if-variants? Est-ce qu'ils tiennent peut-être compte de la possibilité que les concepteurs de POCO aient surchargé ==?

En résumé, si je n'ai pas remplacé ==, est-ce que je sauvegarde en utilisant! = Au lieu de ReferenceEquals()?

Répondre

5

Voici les différentes sémantiques:

  • ReferenceEquals() doit être utilisé si vous voulez dire que les objets sont exactement les mêmes (vérification d'identité).
  • object.Equals() doit être utilisé si vous voulez dire les objets ont la même valeur (vérification de l'égalité)
  • ==() ne doivent être utilisés pour les types immuables. Ensuite, utilisez-le pour tester l'égalité.

Bien entendu, les contreparties inversées sont signifiées en conséquence.

Here is a summary

+0

Pourquoi la règle d'or 'Si vous voulez savoir si deux objets se réfèrent à la même instance USE SEULEMENT ReferenceEquals'? MSDN indique 'Pour les types de référence autres que string, == renvoie true si ses deux opérandes font référence au même objet. 'Http://msdn.microsoft.com/fr-fr/library/53k8ybth.aspx Ne pas contester la règle d'or, Je veux juste le comprendre. –

+0

Juste parce que ça fonctionne toujours. Le == pourrait être mal implémenté ce qui le rend potentiellement problématique. Il m'a sauvé la vie quand j'ai décidé de rendre mes objets immuables dans un projet, où == est dépassé pour l'égalité et non l'identité. Donc j'utilise toujours ReferenceEquals si les objets, et non les valeurs, doivent être comparés. – jdehaan

-3

== devrait tester pour voir si les points de référence au même endroit alors que les tests de ReferenceEquals pour voir si elles contiennent les mêmes données

+0

L'autre façon serait correct autour – jdehaan

+0

Je pense que cela devrait être le contraire, TBH. – Anton

+0

Hmm ... Eh bien après quelques tests rapides == et ReferenceEquals produisent les mêmes résultats mais je suppose que vous avez raison. Oh bien-points pour moi :) – Buildstarted