如果您曾经使用过Reflector,您可能会注意到C#编译器会生成类型,方法,字段和局部变量,这些变量值得调试器"特殊"显示.例如,以"CS $"开头的局部变量不会显示给用户.匿名方法的闭包类型,自动属性的后备字段等还有其他特殊的命名约定.
我的问题:在哪里可以了解这些命名约定?有谁知道一些文件?
我的目标是使PostSharp 2.0使用相同的约定.
根据这个答案,当代码使用lambda方法内部的局部变量时,编译器将生成可以具有名称的额外类c__DisplayClass1.例如以下(完全无用的)代码:
class Program
{
static void Main()
{
try {
implMain();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
static void implMain()
{
for (int i = 0; i < 10; i++) {
invoke(() => {
Console.WriteLine(i);
throw new InvalidOperationException();
});
}
}
static void invoke(Action what)
{
what();
}
}
Run Code Online (Sandbox Code Playgroud)
输出以下调用堆栈:
System.InvalidOperationException
at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0()
at ConsoleApplication1.Program.invoke(Action what)
at ConsoleApplication1.Program.implMain()
at ConsoleApplication1.Program.Main()
Run Code Online (Sandbox Code Playgroud)
请注意,c__DisplayClass2其中有一个由编译器生成的用于保存循环变量的类的名称.
根据这个答案 c__DisplayClass "手段"
c - >匿名方法闭包类("DisplayClass")
好的,但"DisplayClass"在这里意味着什么?
这会产生什么类"显示"?换句话说,为什么它不是"MagicClass"或"GeneratedClass"或任何其他名称?
我有一个带有以下签名的方法
[Specification]
public void slide_serialization() {
Run Code Online (Sandbox Code Playgroud)
从我的代码中的一点来看,我需要向上移动堆栈跟踪以找到最接近的方法SpecificationAttribute(性能不是问题).我发现这个方法,但我找不到任何自定义属性.

我认为我从未见过这种情况.可能是什么原因?
这是一个单元测试程序集,在Build中禁用了Optimization.