加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:08:17 所属栏目:百科 来源:网络整理
导读:这个简单的课程 public class TestT{ public static void A(Window wa,Window wb) { wa.Closed += (s,e) = wb.Close(); }} 获取编译为this(我使用Reflector进行反编译): public class TestT{ [CompilerGenerated] private sealed class c__DisplayClass1 {
这个简单的课程

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并直接读取它,如果你想要一个漂亮的原始视图.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读