“sinon si()” et plusieurs “si()”s en C#
Comment ces pratiquement diffèrent-ils?
//Approach one
if (x == 1)
DoSomething();
else if (x == 2)
DoSomethingElse();
//Approach two
if (x == 1)
DoSomething();
if (x == 2)
DoSomethingElse();
Est le CIL de la même manière?
(La question L'utilisation de “if/elseif/else” et “if/else{if/else}” existe, mais il est encore sans réponse.)
OriginalL'auteur Jerry Nixon - MSFT | 2013-01-16
Vous devez vous connecter pour publier un commentaire.
Si
DoSomething
jeux dex
à 2, alors qu'ils diffèrent.else
contiendra le champ d'application de l'ensemble du si de sorte qu'il s'exécute automatiquement. Cela fait sens pour moi. Je ne l'aurais cru. Des acclamations.Quelque chose comme ça! Grammaticalement parlant, la première démarche est identique à
if(...) { ... } else { if(...) { ... } }
.OriginalL'auteur Oliver Charlesworth
Résultats dans:
Tout:
Résultats dans:
Code IL est un peu différent et c'est ici la principale différence:
Lorsque vous utilisez l'instruction else, comme dans la première approche, seule la première branche qui répond à la condition sera exécuté. Sur l'autre main... avec la deuxième approche, chaque case est traitée et toutes les cases qui répond à la condition d'être suivie et traitée. C'est la principale différence.
C'est pourquoi dans la première approche, IL code vous avez un "ret" directive juste après l'appel de la Console.WriteLine alors que dans le second il n'est pas présent. Dans le premier cas, la méthode ne peut être quitté juste après une vérification a été adopté en raison de pas plus de contrôles sur les
x
sera effectué... dans la seconde approche, vous avez pour suivre toutes l'une après l'autre et c'est pourquoi ret est seulement apparaissant à la fin de la méthode, pas de "raccourcis" à la fin.Pour mon test, j'ai utilisé un
Console.WriteLine()
appel... mais c'est sûr que siDoSomething()
implique une modification de la valeur d'x
variable, la différence sera absolument plus important dans le comportement du code. Disons que nous avons x privé de membre statique (valeur initiale toujours 1) au lieu d'une variable locale et:Dans la première approche, même si
m_X
suppose une valeur de 2 aprèsDoSomething()
est appelé grâce à la première vérification, d'autre prendra la méthode de sortie etDoSomethingElse()
ne sera jamais appelé. Dans la deuxième approche, les deux méthodes seront appelées.OriginalL'auteur Tommaso Belluzzo
Noter qu'il n'y a pas de
else if
construire en C#. Votre premier exemple de code est exactement le même que:Car il n'existe qu'une seule instruction dans
else
, les accolades peuvent être omis, et pour une meilleure lisibilité,if
est généralement écrit sur la même ligne que le précédent,else
. L'écriture de plusieurs "else if
" états est équivalent à plus de nidification:Ci-dessus peut être écrite comme:
De cela, vous pouvez voir que le chaînage "
else if
" etif
peut produire des résultats différents. En cas de "else if
", la première branche qui répond à la condition sera exécutée, et après que aucune vérification supplémentaire n'est effectuée. En cas de enchaînésif
états, de toutes les branches qui répondent à leurs conditions d'exécution.La principale différence ici, c'est lors de l'exécution d'une branche provoque un état ultérieur. Par exemple:
VS
Dans le premier cas,
x == 2
, tandis que dans le second casx == 3
.OriginalL'auteur Bojan Resnik
Lorsque l'on code comme ceci
Chaque fois que la condition des contrôles.
Mais lorsque l'on code comme ceci
Si la première condition est vraie, alors il l'habitude de la coche à côté de l'autre, s'condition et ainsi diminuer inutile de compiler.
tu veux dire diminution de l'élément de contrôles. Car la compilation-sage, je ne vois pas ce qui va diminuer avec le temps!
OriginalL'auteur
Lorsque vous utilisez
else
déclaration, une seule des branches sera exécutée (c'est à dire la première, qui répond à laif
condition). Tous les autresif
conditions de ne pas même être estimé:Alors que quand vous ne l'utilisez pas chacun d'entre eux peut être, en fonction de chacune des conditions), c'est à dire chacun d'entre eux est d'environ un par un:
Donc, IL peut différer.
x == 2
avecx < 2
de montrer pourquoi.OriginalL'auteur horgh
Pas anwsers sur les performances?
Donc, si x=1 alors vous n'avez qu'une seule case dans le premier cas, et dans le deuxième cas, il n'2 contrôles, de sorte que le premier cas est plus rapide.
OriginalL'auteur Gumowy Kaczak
Si x change (en Ne Seomthing et DoSomethingElse) puis la première instruction de ne jamais exécuter une instruction. Dans le 2ème exemple toutes les déclarations seront vérifiées (sauf bien sûr si le compilateur optimise pour un saut de la table pour le nombre de comparaison).
OriginalL'auteur Jesus Ramos
Lorsque vous utilisez plusieurs
else if
, il exécutera la condition que satisfait. Si il y a des cas restants, ils seront ignorés. Lorsque vous avez plusieursif
, il va vérifier à chaque instruction. Donc, cela devient de plus en plus d'un problème de performances.OriginalL'auteur drum
Si
x
est modifié par plusieurs threads, il est possible queDoSomething()
etDoSomethingElse()
permettra à la fois d'être appelé avec la deuxième approcheOriginalL'auteur JG in SD
Else if sera évaluée uniquement si la première condition n'était pas vrai. Mais deux années consécutives si des instructions seront évalués.
Vous pouvez facilement tester ce concept dans un L'interpréteur Python:
De la première exécution de cette:
Remarque: En Python elif est utilisé à la place de l'autre, s'
puis exécutez ce
OriginalL'auteur Don't Know