E' interessante notare che il compilatore Visual C# genera per gli snippet a sinistra lo stesso codice IL degli snippet a destra:
class Foo { static void DoSomething() { if (true) {} } } |
class Foo { static void DoSomething() {} } |
class Foo { static void DoSomething() { if (false) {} } } |
class Foo { static void DoSomething() { goto here; here:; } } |
Quando l'espressione booleana è sempre true, il compilatore sostituisce l'if con il ramo then, mentre quando l'espressione booleana è sempre false, il compilatore sostituisce l'if con un salto incondizionato al ramo else. Nel primo caso si genera solo il codice per il ramo then, mentre nel secondo caso solo il codice per il ramo else.
Il compilatore Visual Basic .NET invece, genera lo stesso schema di codice per If True e If False, generando un salto condizionato al ramo Then, respettivamente al ramo Else, in base a un valore intero inserito prima nello stack (il valore diverso da 0, inserisce 1, rispettivamente uguale a 0, inserisce 0). Quindi il compilatore Visual Basic .NET non ottimizza l'If in base alla sua espressione booleana, generando sempre codice per tutti e due i rami, Then e Else.
La frase del giorno:
"Sarà certamente pieno di polvere il mio solaio, ma conserva una cosa di cui non vorrei liberarmi: la ruota della bicicletta con cui mio marito Ettore di notte andava a lavorare"
- Alda Merini