Étant donné que cette très naturel de cas d'utilisation (si vous ne savez pas ce que fait réellement)
if (x is Bar) {
Bar y = x as Bar;
something();
}
est en fait l'équivalent (c'est à dire, généré par le compilateur, IL de le code ci-dessus sera équivalent) pour
Bar y = x as Bar;
if (y != null) {
y = x as Bar; //The conversion is done twice!
something();
}
EDIT:
Je suppose que je n'avais pas fait ma question claire. Je n'aurai plus jamais écrire le deuxième extrait que bien sûr, c'est redondant. Je suis en prétendant que le IL généré par le compilateur lors de la compilation de premier extrait est équivalente à la deuxième extrait, qui est redondante. Questions: a) Est-ce correct b) Si oui, pourquoi est est mis en œuvre comme cela?
Parce que j'ai trouver le premier extrait de code beaucoup plus clair et plus joli que l'réellement bien écrit
Bar y = x as Bar;
if (y != null) {
something();
}
EDIT 2: Merci d'essayer d'éviter d'ajouter des guillemets pour le titre, si possible, merci!
CONCLUSION:
L'optimisation de l'est/de cas n'est pas le compilateur de la responsabilité, mais l'équipe de l'.
En outre, comme avec null check a de moins en moins (et moins cher) instructions que les deux alternatives (est et et est et de la distribution).
Addendum:
IL pour avec nullcheck (.NET 3.5):
L_0001: ldarg.1
L_0002: isinst string
L_0007: stloc.0
L_0008: ldloc.0
L_0009: ldnull
L_000a: ceq
L_000c: stloc.1
L_000d: ldloc.1
L_000e: brtrue.s L_0019
L_0011: ldarg.0
L_0019: ret
IL est et cast (.NET 3.5):
L_0001: ldarg.1
L_0002: isinst string
L_0007: ldnull
L_0008: cgt.un
L_000a: ldc.i4.0
L_000b: ceq
L_000d: stloc.1
L_000e: ldloc.1
L_000f: brtrue.s L_0021
L_0012: ldarg.1
L_0013: castclass string
L_0018: stloc.0
L_0019: ldarg.0
L_0021: ret
IL est et que (.NET 3.5):
L_0001: ldarg.1
L_0002: isinst string
L_0007: ldnull
L_0008: cgt.un
L_000a: ldc.i4.0
L_000b: ceq
L_000d: stloc.1
L_000e: ldloc.1
L_000f: brtrue.s L_0021
L_0012: ldarg.1
L_0013: isinst string
L_0018: stloc.0
L_0019: ldarg.0
L_0021: ret
Ceux-ci ont été modifiés pour la brièveté (déclarations de méthode, des opr et des appels à quelque chose() supprimé)