c# - 为什么 Lambda 的 MethodBody 在调用后会发生变化?

标签 c# lambda

我想知道是否有人可以向我解释一下。 出于某种原因,lambda 的 MethodBody 似乎在调用后发生了变化。

以下代码片段使用一个外部变量创建一个简单的 lambda 并检查方法主体。

    int x = 7;
    Func<int> f = () => x;

    int before = f.Method.GetMethodBody().GetILAsByteArray().Length;
    f();
    int after = f.Method.GetMethodBody().GetILAsByteArray().Length;

在这种情况下,调用前的长度为 11 个字节,调用后为 126 个字节。

ILDASM 将 DLL 中的 lambda 主体(在 case 之前)显示为具有预期 IL 的 11 个字节:

  IL_0000:  ldarg.0
  IL_0001:  ldfld      int32 Tests.LambdaTest::x
  IL_0006:  stloc.0
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.0
  IL_000a:  ret

我没有时间尝试反汇编“之后”的情况,因为(大概)我必须在运行时提取 IL 以输入反汇编程序。我知道它确实包含相关的 ldfld。可能如果我确实遇到了麻烦,这可能是显而易见的 (?)

这对我来说并不重要,只是想了解发生了什么。

问候,

安德鲁

最佳答案

找到了。

似乎是 Telerik JustMock 中的代码编织器。

如果我完全禁用加载项,则 MethodBody 不会改变。

让我有点吃惊,因为我实际上并没有在这些项目中使用任何模拟。我将不得不检查 doco 以了解默认情况下 JustMock 加载项可能在做什么(如果有的话)。

再次感谢快速响应者,因为他们强调了它在某种程度上是环保的。

关于c# - 为什么 Lambda 的 MethodBody 在调用后会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20512750/

相关文章:

c# - 如何比较多维字符串数组?

C++ 内联 lambda 参数的概念

c# - 我怎样才能用C#编写这个java代码

c# - WCF 终结点的默认超时值

node.js - NodeJS 基本认证

java - 是否有可用于任何 lambda 的无操作 (NOP) 的方法引用?

python - 在 Django 的过滤器查询中使用 lambda

python - Python 中使用 lambda + filter 进行列表过滤

c# - 使用 C# 通过 URL 生成站点地图

c# - ASP.NET MVC/C# : Can I avoid repeating myself in a one-line C# conditional statement?