2010-03-11 4 views

Répondre

9

Eh bien, je venais d'utiliser == (si vous essayez d'éviter un opérateur d'égalité personnalisé, peut-être jeté à object - ce sera un casting NOP de toute façon)

autre que que, mon argent irait avec object.ReferenceEquals(obj, null), mais vous pouvez également utiliser object.Equals(obj, null) car il gère null etc.

Pour être complet: pourquoi devrais-je simplement utiliser ==/!=? Simple: le compilateur peut le faire directement . IL pour une nulle vérification contre un objet est en fait:

  • charge l'arbitre
  • branche
  • si elle est vraie (ou branche si elle est fausse)

Voilà. Deux instructions IL. Il ne fait même pas de "load null, equal check" - puisque la définition de "true" est "tout ce qui n'est pas 0/null", et "false" est "0/null".

Pour quelque chose comme ReferenceEquals, qui est la suivante:

  • charge l'arbitre
  • charge la valeur nulle
  • appeler la méthode
  • (qui crée un stackframe)
  • charge la première arg
  • charger le second argument
  • faire une égalité chec k
  • (passe alors la valeur vers le bas le cadre de la pile retournant true/false)
  • branche si elle est vraie (ou branche si elle est fausse)

Je sais que je préfère ...

+0

Marc, comment le savez-vous? Comment savez-vous combien d'instructions IL est une déclaration C#? Comment puis-je l'apprendre aussi? –

+0

@Dran: Réflecteur. De plus, je suis en train de faire beaucoup de méta-programmation, en écrivant directement IL. –

1

Comment vérifier si quelque chose est nul si vous ne voulez pas utiliser un opérateur? Quelle est la raison de cette question?

+0

Avec une méthode statique? Staticclass.IsNull (variable) Je voudrais vérifier s'il est possible d'écrire du code sans utiliser d'opérateurs. –

+1

@Dran - mais ** pourquoi ** voulez-vous écrire du code sans opérateurs? Les opérateurs sont (surtout dans ce cas) * plus rapides *. –

5

Vous pouvez utiliser object.ReferenceEquals(variable, null).

+2

... ou en créant une méthode d'extension et en l'appelant comme 'obj.IsNotNull()' –

2

Appel ToString() dessus, si vous obtenez une exception System.NullReferenceException, elle était nulle. :-)

Mais pourquoi?

+0

Cela fonctionne. J'espère que c'était la langue dans la joue bien. –

+0

@Martinho - très bien! –

0

Eh bien, la seule autre syntaxe qui correspond à votre description est d'utiliser le ?? opérateur, (qui est toujours un opérateur, je gues ...), Mais il renvoie soit la valeur, ou si la valeur est nulle, elle retourne la prochaine expressions valeur que dans

string nullStr = null; 
string out1 = nullStr?? "NullString"; // out1 = "NullString"; 
// ------------------------------------------------------------ 
string realStr = "RealString"; 
string out2 = realStr ?? "NullString"; // out2 = "RealString"; 
2

Vous pourriez vraiment être une secousse et de l'utilisation:

if (x is object) { 
    // not null 
} 
else { 
    // null 
} 
+0

Je ne savais pas 'is' a donné faux pour null. Merci. Pas que je vais utiliser ce code n'importe où :) –