为什么生成的IL代码以Nop开头?

30

我在通过ILDasm查看我的某个程序集的IL时发现,我的所有方法都以nop指令开头。

有人知道这是为什么吗?

1个回答

45
汇编语言是以调试模式编译的。指令Nop并没有实际作用,但是它可以作为一个方便的指令来设置断点。
提示:
如果您需要一个额外的断点用于调试目的,您可以通过添加一对空括号来强制在调试构建中包含Nop
_grid.PreviewMouseRightButtonDown += (sender, e) =>
{
    _isRightMouseDown = true;

    RowColumnIndex cell = _grid.PointToCellRowColumnIndex(e);
    {} //<------ Adding a Nop allows a breakpoint here.
};

6
是的,它们确实会浪费计算资源而没有任何作用。它们是使调试版本变慢的原因之一。 - Tim Lloyd
1
即时编译器应该将它们优化出原生指令流程。 - devstuff
1
@devstuff 我在谈论 Debug 构建 - 它们没有被优化掉。如果是这种情况,我就不会将其添加为技巧了。 - Tim Lloyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接