微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 来自通用类中的事件订阅代码的奇怪反编译代​​码

这个简单的课程

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

获取编译为this(我使用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?
这是一个Reflector错误吗?

编辑:
实际上,在这种情况下,似乎Reflector优化并不是很好,因此禁用优化反编译代码是有意义的:

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;
        }
    }
}

解决方法

Reflector正在“优化”输出,试图想出C#可能看起来像什么.我不知道“基础”位来自哪里,不可否认……但生成的类肯定会被使用.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐