如果您尝试使用反编译器,例如:jetbrains dotpeek、redgate Reflector、telerik justdecompile,等等..有时,如果您需要复制代码或只是为了理解,这是不可能的,因为会显示类似的内容:
[CompilerGenerated]
private sealed class Class15
{
// Fields
public Class11.Class12 CS$<>8__locals25;
public string endName;
// Methods
public Class15();
public bool <Show>b__11(object intelliListItem_0);
}
我没有考虑混淆,这种情况随时都会发生,我做了一些测试(我自己的代码),并且使用 lambda 和迭代器发生。我不确定,有人可以提供更多关于何时以及为什么的信息吗?
因此,根据标准 Visual Studio 不会在 C# 中编译 $ 和 关键字(如上面的代码)...
有没有办法自动翻译或转换这个反编译代码?
Lambda 是闭包的一种形式,这是一种优雅的说法,它是一个可以像对象一样传递的代码单元(但可以访问其原始上下文)。当编译器找到 lambda 时,它会生成一个新类型(Type 是类或结构),该类型封装代码以及 lambda 在其原始上下文中访问的任何字段。
这里的问题是,如何生成永远不会与用户编写的代码发生冲突的代码?
编译器的答案是生成在您使用的语言中非法但在 IL 中合法的代码。 IL 是“中间语言”,它是公共语言运行时使用的母语。任何在 CLR 上运行的语言(C#、vb.net、F#)都会编译为 IL。这就是您如何在 C# 代码等中使用 VB.Net 程序集。
这就是反编译器生成您所看到的丑陋代码的原因。迭代器遵循与许多其他需要生成类型的语言功能完全相同的模型。
有一个有趣的副作用。 Lambda 可以捕获原始上下文中的变量:
public void TestCapture()
{
StringBuilder b = new StringBuilder();
Action l = () => b.Append("Kitties!");
}
因此,我所说的捕获是指这里的变量 b 包含在定义闭包的包中。
编译器会尝试提高效率并创建尽可能少的类型,因此您最终可以得到一个生成的类,该类支持在特定类中找到的所有 lambda,包括所有捕获的变量的字段。这样,如果你不小心,你可能会意外捕获你期望释放的东西,从而导致跟踪内存泄漏非常棘手。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)