Oui, c'est le cas, au moins pour le Debug
appel. Je ne vois pas ici si le compilateur JIT a également supprimé l'évaluation de l'élément if
mais je suppose que c'est le cas puisque l'équation n'a pas d'effets secondaires.
Cependant, il est préférable de le garder en sécurité en appelant Debug.WriteLineIf
qui ne dépend pas du compilateur JIT pour supprimer l'évaluation.
Pour être complet, la preuve que le compilateur supprime l'option Debug.WriteLine
.
Le code dans le Release build :
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 17 (0x11)
.maxstack 8
IL_0000: call string [mscorlib]System.Console::ReadLine()
IL_0005: ldstr "Ok"
IL_000a: call bool [mscorlib]System.String::op_Inequality(string,
string)
IL_000f: pop
IL_0010: ret
} // end of method Program::Main
Code dans la version Debug :
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 42 (0x2a)
.maxstack 2
.locals init ([0] string state,
[1] bool V_1)
IL_0000: nop
IL_0001: call string [mscorlib]System.Console::ReadLine()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "Ok"
IL_000d: call bool [mscorlib]System.String::op_Inequality(string,
string)
IL_0012: stloc.1
IL_0013: ldloc.1
IL_0014: brfalse.s IL_0029
IL_0016: nop
IL_0017: ldstr "Error occured: {0}"
IL_001c: ldloc.0
IL_001d: call string [mscorlib]System.String::Format(string,
object)
IL_0022: call void [System]System.Diagnostics.Debug::WriteLine(string)
IL_0027: nop
IL_0028: nop
IL_0029: ret
} // end of method Program::Main
Comme vous le voyez, le mode Release n'a pas d'appel à Debug.WriteLine
alors que le mode Debug le fait.
26 votes
Utilisez le
Debug.WriteLineIf
método.4 votes
Remarque : Il n'existe pas de compilateur C# unique. Il existe plusieurs compilateurs C#, dont chacun a été publié dans de nombreuses versions. La spécification C# ne prévoit que très peu d'optimisations obligatoires (voire aucune), de sorte que votre réponse ne pourra jamais concerner qu'un compilateur particulier et une version particulière.