Странный декомпилированный код из кода подписки на события в универсальном классе - PullRequest
4 голосов
/ 01 июля 2010

Этот простой класс

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, если он никогда не используется?Это ошибка 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;
        }
    }
}

1 Ответ

1 голос
/ 01 июля 2010

Reflector «оптимизирует» вывод, чтобы попытаться придумать, как мог выглядеть C #.Я не знаю, откуда берется «базовый» бит, по общему признанию ... но сгенерированный класс определенно используется .

Установите для параметров Reflector значение "unoptimised", и выувидим что-то похожее на прямое преобразование IL в C #.Или просто переключитесь на IL и прочитайте его напрямую, если вы хотите довольно сырой вид.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...