2009-06-03 2 views
5

Использование отражателя я получаю следующий результат:Для чего предназначены эти коды операций?

.method private hidebysig static class myModelTestarea.Foo Method() cil managed 
{ 
    .maxstack 1 
    .locals init ([0] class myModelTestarea.Foo CS$1$0000) 
    L_0000: nop 
    L_0001: ldc.i4.0 
    L_0002: newarr object 
    L_0007: call object myModelTestarea.Program::Resolve(object[]) 
    L_000c: castclass myModelTestarea.Foo 
    L_0011: stloc.0 
    L_0012: br.s L_0014 
    L_0014: ldloc.0 
    L_0015: ret 
} 

для

private static Foo Method() 
{ 
    return (Foo)Resolve(); 
} 

private static object Resolve(params object[] args) 
{ 
    return new Foo(); 
} 

Что линии 11-14 делать? Я вызываю функцию и получаю результат (строка 7). Я передал результат правильному возврату (строка c) - почему бы не вернуться прямо сейчас?

Каким-то образом литой результат сохраняется как локальная переменная - тогда происходит переход к следующей строке, где снова загружается локальная переменная. Зачем?

На мой взгляд, строка 11-14 и локальная переменная могут быть опущены ...?

+1

FYI, моя статья в блоге об этом будет развиваться 11-го числа. –

+0

Спасибо за информацию ... Я посмотрю – tanascius

+5

Вот ссылка: http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do .aspx –

ответ

13

Это похоже на сборку DEBUG, которая выходит в дополнительный IL, чтобы помочь отладчику. Попробуйте еще раз в RELEASE, и он должен выглядеть более чистым, с оптимизацией и т. Д.

.method private hidebysig static class program/Foo Method() cil managed 
{ 
    .maxstack 8 
    L_0000: ldc.i4.0 
    L_0001: newarr object 
    L_0006: call object program::Resolve(object[]) 
    L_000b: castclass program/Foo 
    L_0010: ret 
} 
+0

Да, имеет смысл хранить результат локально для сборки отладки - спасибо – tanascius

+0

Просто, чтобы быть понятным, это происходит при построении с опцией оптимизации, а не отладки +, хотя набор Debug по умолчанию устанавливает оба. – Lucas

+0

Желаю, чтобы блог Эрика пришел раньше ;-p –

4

Это отладочная сборка? Возможно, что он существует ради отладчика.

Я видел подобные вещи в других местах - это почти всегда безвредно. Не забывайте, что большая часть оптимизации выполняется JIT, которая может легко заметить такие вещи. Единственным недостатком является то, что больше IL намекает на JIT, что метод не должен быть встроен.