Хорошо, давайте сначала посмотрим на первый метод в IL (я использую IL SPY )
.method public hidebysig static
void MethodWithDelegate (
class [mscorlib]System.Threading.SynchronizationContext context
) cil managed
{
// Method begins at RVA 0x2059
// Code size 41 (0x29)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldsfld class [mscorlib]System.Threading.SendOrPostCallback so8254847.Methods::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_0007: brtrue.s IL_001c
IL_0009: ldnull
IL_000a: ldftn void so8254847.Methods::'<MethodWithDelegate>b__0'(object)
IL_0010: newobj instance void [mscorlib]System.Threading.SendOrPostCallback::.ctor(object, native int)
IL_0015: stsfld class [mscorlib]System.Threading.SendOrPostCallback so8254847.Methods::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_001a: br.s IL_001c
IL_001c: ldsfld class [mscorlib]System.Threading.SendOrPostCallback so8254847.Methods::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_0021: ldnull
IL_0022: callvirt instance void [mscorlib]System.Threading.SynchronizationContext::Send(class [mscorlib]System.Threading.SendOrPostCallback, object)
IL_0027: nop
IL_0028: ret
} // end of method Methods::MethodWithDelegate
Как вы можете видеть, в IL_0007 есть условная ветвь, которая только выполняетсяесли кешированный анонимный делегат был установлен в противном случае, он проходит через основной код настройки вашего делегата, а затем вызывает его.
РЕШЕНИЕ: дважды запустите тест - или забудьте об этом, так как он немного оптимизирован для .NET
Теперь для второй задачи на этот раз лучше посмотреть, что на самом деле было произведено в C #- вы написали операторы switch, но вместо этого компилятор использовал ifs
public static string MethodWithSwitchStatement(Type value)
{
string output = string.Empty;
if (value != null)
{
string a;
if ((a = value.ToString()) != null && a == "System.Int32")
{
output = "int";
}
else
{
output = "other type";
}
}
return output;
}
Как вы можете видеть, компилятор ввел тест if null с оператором switch, но поскольку он уже есть, он никогда не будет выполнен..
РЕШЕНИЕ: удалите исходный тест null (так как он не нужен).