Tak, przynajmniej dla połączenia Debug
. Nie widzę tutaj, jeśli kompilator JIT również usunięto ocenę if
, ale myślę, że tak, ponieważ równanie nie ma żadnych skutków ubocznych.
Jednak lepiej jest zachować bezpieczeństwo, dzwoniąc pod numer Debug.WriteLineIf
, który nie zależy od kompilatora JIT, aby usunąć ocenę.
Dla kompletności dowód dla kompilatora do usunięcia Debug.WriteLine
.
Kod w kompilacji Release:
.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
kod w debugowania:
.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
Jak widać w trybie Release nie ma połączenia z Debug.WriteLine
, gdzie tryb Debug robi.
Użyj metody 'Debug.WriteLineIf'. –
Uwaga: Nie ma jednego kompilatora C#. Istnieje kilka kompilatorów C#, z których każdy został wydany w wielu wersjach. Specyfikacja C# ma bardzo niewiele (jeśli w ogóle) obowiązkowych optymalizacji, więc twoja odpowiedź mogłaby dotyczyć tylko konkretnego kompilatora i konkretnej wersji. –