En c #, y a-t-il une différence de vitesse d'exécution pour l'ordre dans lequel vous énoncez la condition?
if (null != variable) ...
if (variable != null) ...
Depuis récemment, j'ai vu le premier assez souvent, et il a retenu mon attention puisque j'étais habitué au second.
S'il n'y a pas de différence, quel est l'avantage du premier?
c#
coding-style
mr_georg
la source
la source
Réponses:
C'est un retard de C. En C, si vous utilisez un mauvais compilateur ou si vous n'avez pas d'avertissements suffisamment élevés, cela se compilera sans aucun avertissement (et c'est en effet du code légal):
quand tu voulais probablement dire
Vous pouvez contourner ce problème en C en faisant:
Une faute de frappe ici entraînera un code invalide.
Maintenant, en C #, tout est piffle. À moins que vous ne compariez deux valeurs booléennes (ce qui est rare, IME), vous pouvez écrire le code le plus lisible, car une instruction "if" nécessite une expression booléenne pour commencer, et le type de "
x=5
" estInt32
, nonBoolean
.Je suggère que si vous voyez cela dans le code de vos collègues, vous les éduquez aux voies des langues modernes et suggérez qu'ils écrivent la forme la plus naturelle à l'avenir.
la source
else { }
clause vide au cas où quelqu'un aurait besoin d'y ajouter quelque chose plus tard et oublierait d'écrire leelse
mot-clé lui-même. (Blague)Il y a une bonne raison d'utiliser d'abord null:
if(null == myDuck)
Si votre
class Duck
remplace l'==
opérateur, alorsif(myDuck == null)
peut entrer dans une boucle infinie.Utiliser
null
first utilise un comparateur d'égalité par défaut et fait réellement ce que vous vouliez.(J'entends que vous vous habituez finalement à lire du code écrit de cette façon - je n'ai tout simplement pas encore vécu cette transformation)
Voici un exemple:
la source
==
opérateur et posez-le là, et vous verrez que la surcharge définie par l'utilisateur est utilisée dans les deux cas. Bien sûr, cela peut faire une différence subtile si vous vérifieza
avantb
, puis permutez la position de l'a
opérande droit à l'opérande gauche. Mais vous pouvez également vérifierb
avanta
, et ceb == null
serait alors celui qui a inversé l'ordre. Tout cela est déroutant pour que l'opérateur s'appelle lui-même. Au lieu de cela, transtypez l'opérande (ou les deux) enobject
pour obtenir la surcharge souhaitée. Commeif ((object)a == null)
ouif (a == (object)null)
.Comme tout le monde l'a déjà noté, cela vient plus ou moins du langage C où vous pourriez obtenir un faux code si vous oubliez accidentellement le deuxième signe égal. Mais il y a une autre raison qui correspond également à C #: la lisibilité.
Prenons juste cet exemple simple:
Si vous permutez simplement tous les mots nuls au début, vous pouvez repérer beaucoup plus facilement toutes les vérifications:
Donc, cet exemple est peut-être un mauvais exemple (reportez-vous aux directives de codage), mais pensez simplement à faire défiler rapidement un fichier de code complet. En voyant simplement le motif
vous savez immédiatement ce qui va suivre.
Si c'était l'inverse, vous devez toujours scanner jusqu'à la fin de la ligne pour voir le contrôle de nullité, vous laissant simplement trébucher pendant une seconde pour savoir quel type de contrôle est effectué. Alors peut-être que la coloration syntaxique peut vous aider, mais vous êtes toujours plus lent lorsque ces mots-clés sont à la fin de la ligne au lieu du début.
la source
Je suppose que c'est un programmeur C qui a changé de langue.
En C, vous pouvez écrire ce qui suit:
Notez l'utilisation d'un seul signe égal ici, ce qui signifie que le code attribuera 1 à la variable i, puis retournera 1 (une affectation est une expression) et utilisera 1 dans l'instruction if, qui sera traitée comme vraie. En d'autres termes, ce qui précède est un bogue.
En C # cependant, ce n'est pas possible. Il n'y a en effet aucune différence entre les deux.
la source
Autrefois, les gens oubliaient le «!» (ou le supplément '=' pour l'égalité, qui est plus difficile à repérer) et faites une affectation au lieu d'une comparaison. mettre le null devant élimine la possibilité du bogue, puisque null n'est pas une valeur l (IE il ne peut pas être assigné).
La plupart des compilateurs modernes donnent un avertissement lorsque vous effectuez une affectation dans un conditionnel de nos jours, et C # donne en fait une erreur. La plupart des gens s'en tiennent au schéma var == null car il est plus facile à lire pour certaines personnes.
la source
Je ne vois aucun avantage à suivre cette convention. En C, où les types booléens n'existent pas, il est utile d'écrire
plutôt que
car si vous oubliez l'un des signes égaux, vous vous retrouvez avec
qui attribue 5 à la variable et toujours évalué à vrai. Mais en Java, un booléen est un booléen. Et avec! =, Il n'y a aucune raison du tout.
Un bon conseil, cependant, est d'écrire
plutôt que
car cela permet d'éviter les NullPointerExceptions.
Mon conseil serait de demander une justification de la règle. S'il n'y en a pas, pourquoi le suivre? Cela n'aide pas la lisibilité
la source
Pour moi, c'est toujours le style que tu préfères
@Shy - Encore une fois, si vous confondez les opérateurs, vous devriez vouloir obtenir une erreur de compilation ou vous exécuterez du code avec un bogue - un bogue qui reviendra et vous mordra plus tard car il a produit un comportement inattendu
la source
Comme beaucoup l'ont souligné, c'est principalement dans l'ancien code C qu'il a été utilisé pour identifier une erreur de compilation, car le compilateur l'a accepté comme légal
Les nouveaux langages de programmation comme java, go sont suffisamment intelligents pour capturer de telles erreurs de compilation
Il ne faut pas utiliser "null! = Variable" comme des conditions dans le code car il est très illisible
la source
Une dernière chose ... Si vous comparez une variable à une constante (entier ou chaîne par exemple), mettre la constante à gauche est une bonne pratique car vous ne rencontrerez jamais NullPointerExceptions:
tandis que
Maintenant, puisque par défaut C # instancie toutes les variables, vous ne devriez pas avoir ce problème dans ce langage.
la source
i
c'est une valeur aléatoire sans une initialisation appropriée. l'expression a complètement la même sémantique en c / c ++