空<>在C#类名之前

时间:2011-09-09 05:36:30

标签: c# decompiling

我需要修复使用.NET 4反编译的C#代码。不幸的是,在我的工作站上只安装了.NET 3.5,这可能是以下代码无法编译的原因:

ReportPage.<>c__DisplayClass26 <>c__DisplayClass = new ReportPage.<>c__DisplayClass26();

什么&lt;&gt;建筑意味着什么? 除了这一行,代码中的任何地方都没有c__DisplayClass26字符串。这可能意味着此名称是由反编译期间遗漏的某些元信息构成的。

3 个答案:

答案 0 :(得分:4)

C#编译器有时必须引入变量/字段/类。当他必须这样做时,他会将<>添加到他们的名字前面,这样就不会发生名称冲突(使用C#编译器,用这两个字符命名是非法的)。例如,对于自动生成的属性,yield关键字,lambda&amp;匿名函数/委托,新的async关键字(在Async CTP中引入的关键字,可能会出现在C#5.0中)...

现在......奇怪的是,你只有c__DisplayClass26。也许你的反编译器不符合标准。尝试使用IlSpy查看代码。

看看这个pastebin:http://pastebin.com/pTRVyVdp(它不是我的)。 c__DisplayClass有一个例子。在文本的前半部分有“原始”代码,在后半部分是反编译代码。你看,在这种情况下,它用于封闭。在第32/33行,有一个[CompilerGenerated] private sealed class <>c__DisplayClass2。你的代码中也应该有它。

嗯...... IlSpy有点太好了:-)通常它能够从CompilerGenerated代码重建“原始”代码。

答案 1 :(得分:4)

xanatos是正确的;您正在查看自动生成的类以实现闭包语义。

我解释C#编译器在代表你做某事时产生的神奇名字的方便指南在这里:

Where to learn about VS debugger 'magic names'

但我再次强调你不应该依赖于此;这仅用于娱乐目的。我们保留随时更改此计划的权利。

答案 2 :(得分:2)

这是一个编译器生成的类。它很可能是从ReportPage类的方法中的匿名委托或lambda创建的。

您应该能够看到反编译代码中使用它的位置,并尝试弄清楚它正在做什么来支持它。