2016-08-23 1 views
1

Voici un morceau de codeL'utilisation d'un objet dans une seule ligne de retour sans déclaration

public override bool Equals(object obj) 
     { 
      var myObj= obj as MyClass; 
      return obj == null || myObj== null || !ReferenceEquals(this, obj) ? false : 
       (this.V1== myObj.V1) && (this.V2== myObj.V2) && (this.V3== myObj.V3); 
     } 

Est-il possible d'utiliser myObj dans la ligne de retour sans le déclarer ci-dessus?

Merci!

+0

Oui, 'return obj == null || obj comme MyClass == null || ! ReferenceEquals (ceci, obj)? faux: vrai; – Enigmativity

+1

Vous pouvez même faire ceci: 'renvoyer obj comme MyClass! = Null && ReferenceEquals (this, obj);'. – Enigmativity

+0

Oh ouais .. Je suis un peu stupide, j'ai caché la partie du code qui a effectivement causé un problème, laissez-moi éditer ... – Cratebox99

Répondre

3

Tout d'abord, la réponse est "oui", mais ce n'est pas vraiment bon signe. Après avoir fait une distribution, si vous allez utiliser plusieurs fois le résultat du casting, vous devez le mettre dans une sorte de variable temporaire.

Dans le code que vous avez présenté, l'expression entière avant ? peut être simplifiée à ReferenceEquals(this, obj) puisque les références égales devraient déjà être sécurisées avec des valeurs nulles.

De plus, étant donné que vous faites des équivalences de référence et que vous renvoyez false en cas d'échec, vous n'avez pas besoin d'autres vérifications. Le côté droit de : est superflu. Il ne s'active que lorsque ref-equals renvoie true, mais dans ce cas, les deux variables comparées sont en fait le même objet - donc toutes les autres comparaisons retourneront vrai de toute façon - donc pas besoin d'elles.

donc .. tout le code réduit à

return ReferenceEquals(this, obj); 

..at moins c'est le fonctionnement de votre expression actuelle.

En raison de cela "tout-réduit-à-juste-l'équalité de référence" je pense réellement que vous ne le vouliez pas de cette façon.

Je pense que vous vouliez vérifier si elles sont égales à ref et retourner rapidement vrai. Alors seulement s'ils n'étaient pas égaux, vous effectueriez des comparaisons par morceaux des propriétés intérieures. Quelque chose comme:

if(refequals(a,b)) return true; 
if((a==null) != (b==null)) return false; 
return a.prop1==b.prop1 && a.prop2 == b.prop2 && ... ; 

.. et vous pouvez compacter à une seule ligne, mais ce qui est le point? Le compacter le rend plus difficile à lire, il n'y a pas de gain de performance réel, il empaquette tout en une ligne ce qui n'est même pas un gain en termes de "longueur de texte" puisque vous pouvez simplement "plier" la fonction dans la plupart des IDE ...

(BTW. en code de ligne finale est a/b/grâce null-safe à refequals TAHT va attraper cas de 2 valeurs nulles et la deuxième ligne délicate qui intercepte tous les cas de null 1 face)