从通用类中的事件订阅代码中奇怪的反编译代码

问题描述 投票:0回答:1

这个简单的课程

public class Test<T>
{
    public static void A(Window wa, Window wb)
    {
        wa.Closed += (s, e) => wb.Close();
    }
}

编译为此(我正在使用 Reflector 进行反编译):

public class Test<T>
{
    [CompilerGenerated]
    private sealed class <>c__DisplayClass1
    {
        public Window wb;

        public void <A>b__0(object s, EventArgs e)
        {
            this.wb.Close();
        }
    }

    public static void A(Window wa, Window wb)
    {
        wa.Closed += delegate(object s, EventArgs e)
        {
            base.wb.Close();
        };
    }
}

base
是什么意思?如果从未使用过,为什么会生成
<>c__DisplayClass1
? 这是反射器错误吗?

编辑: 事实上,在这种情况下,反射器优化似乎并没有很好地发挥作用,禁用反编译代码的优化是有意义的:

public class Test<T>
{
    public Test()
    {
        base..ctor();
        return;
    }

    public static void A(Window wa, Window wb)
    {
        <>c__DisplayClass1<T> CS$<>8__locals2;
        CS$<>8__locals2 = new <>c__DisplayClass1<T>();
        CS$<>8__locals2.wb = wb;
        wa.Closed += new EventHandler(CS$<>8__locals2.<A>b__0);
        return;
    }

    [CompilerGenerated]
    private sealed class <>c__DisplayClass1
    {
        // Fields
        public Window wb;

        public <>c__DisplayClass1()
        {
            base..ctor();
            return;
        }

        public void <A>b__0(object s, EventArgs e)
        {
            this.wb.Close();
            return;
        }
    }
}
c# .net generics delegates
1个回答
1
投票

Reflector 正在“优化”输出,以尝试得出 C# 可能的样子。诚然,我不知道“基础”位来自哪里......但是生成的类is肯定正在使用。

将 Reflector 选项设置为“未优化”,您将看到更像是 IL 到 C# 直接转换的内容。或者,如果您想要一个漂亮的原始视图,只需切换到 IL 并直接阅读它。

© www.soinside.com 2019 - 2024. All rights reserved.