Compiler Generated Cruft - PullRequest
       17

Compiler Generated Cruft

3 голосов
/ 13 ноября 2009

Я пытаюсь восстановить источник из сборки, используя отражатель Reg Gate. Первоначальный источник воспользовался несколькими возможностями C # 3.0, что немного затруднило его восстановление. Например, вот восстановленный источник для анонимного типа. Первое, что выскакивает, это <> из идентификатора класса. Правила именования типов во время выполнения, по-видимому, более либеральны, чем правила времени разработки. Справедливо. Простой поиск и замена исправят это. На какие еще искажения компилятора я должен обратить внимание и как с ними бороться?

[DebuggerDisplay(@"\{ OverrideType = {OverrideType}, EntityType = {EntityType} }", Type="<Anonymous Type>"), CompilerGenerated]
internal sealed class <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar>
{
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly <EntityType>j__TPar <EntityType>i__Field;
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly <OverrideType>j__TPar <OverrideType>i__Field;

    [DebuggerHidden]
    public <>f__AnonymousType1(<OverrideType>j__TPar OverrideType, <EntityType>j__TPar EntityType)
    {
        this.<OverrideType>i__Field = OverrideType;
        this.<EntityType>i__Field = EntityType;
    }

    [DebuggerHidden]
    public override bool Equals(object value)
    {
        var type = value as <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar>;
        return (((type != null) && EqualityComparer<> <<OverrideType>j__TPar>.Default.Equals(this.<OverrideType>i__Field, type.<OverrideType>i__Field)) && EqualityComparer<<EntityType>j__TPar>.Default.Equals(this.<EntityType>i__Field, type.<EntityType>i__Field));
    }

    [DebuggerHidden]
    public override int GetHashCode()
    {
        int num = -338316509;
        num = (-1521134295 * num) + EqualityComparer<<OverrideType>j__TPar>.Default.GetHashCode(this.<OverrideType>i__Field);
        return ((-1521134295 * num) + EqualityComparer<<EntityType>j__TPar>.Default.GetHashCode(this.<EntityType>i__Field));
    }

    [DebuggerHidden]
    public override string ToString()
    {
        StringBuilder builder = new StringBuilder();
        builder.Append("{ OverrideType = ");
        builder.Append(this.<OverrideType>i__Field);
        builder.Append(", EntityType = ");
        builder.Append(this.<EntityType>i__Field);
        builder.Append(" }");
        return builder.ToString();
    }

    public <EntityType>j__TPar EntityType
    {
        get
        {
            return this.<EntityType>i__Field;
        }
    }

    public <OverrideType>j__TPar OverrideType
    {
        get
        {
            return this.<OverrideType>i__Field;
        }
    }
}

Ответы [ 3 ]

6 голосов
/ 13 ноября 2009

Термин, часто используемый для имен с <> в них: неописуемые имена - потому что они недопустимы в C #. Это предотвращает их столкновение с не сгенерированными компилятором именами и не позволяет вам ссылаться на них в C #.

Некоторые вещи, которые могут их вызвать:

  • Блоки итераторов генерируют вложенные типы для их реализации.

  • Инициализаторы массива, такие как:

    int[] x = new int[] { 1, 2, 3 };
    

    создаст класс <PrivateImplementationDetails>{...}. (Но только для определенных типов.)

  • Лямбда-выражения могут создавать новые методы и новые типы для реализации логики, а также статические переменные, используемые для кэширования делегатов и деревьев выражений, где это возможно

  • Если вы компилируете с включенной отладочной информацией, инициализаторы коллекции и объектов, такие как:

    List<string> list = new List<string> { "hello", "there" }`)
    Button button = new Button { Text = "Hi" };
    

    приведет к генерации локальных переменных с неописуемыми именами. (Они используются для хранения временного значения, пока присваиваются свойства и добавляются элементы, до того, как произойдет присвоение действительной переменной.)

  • Динамический код в C # 4 создает всевозможные странные и удивительные вещи

Если вы повысите уровень «оптимизации» в Reflector (View / Options / Disassembler), он, как правило, сделает все возможное, чтобы дать вам что-то вроде исходного кода - отключите оптимизацию для интересного опыта:)

1 голос
/ 13 ноября 2009

Лямбды, которые захватывают переменные, приводят к замыканиям, представленным похожими автоматически создаваемыми типами.

0 голосов
/ 14 ноября 2009

Использование операторов также приводит к небольшому преобразованию кода, как и ключевое слово Static в VB.Net.

...