2 Stimmen

Warum erstellt der CLR eine neue Klasse für anonyme Methoden?

Ich verwende auch in meinen Projekten anonyme Funktionen. Bisher dachte ich, dass der C#-Compiler lediglich eine Methode mit dem im selben Klassen verwendeten Code für die anonyme Methode generiert. Aber nachdem ich diesen Code in IL dekompiliert habe, habe ich gesehen, dass die CLR eine neue Klasse erstellt hat.

public class Comparer
{
    public delegate int Greater(int a, int b);

    public int Great(Greater greater, int a, int b)
    {
        return greater(a, b);
    }
}

static void Main(string[] args)
{
    int valueOfA = 11,
        valueOfB = 23,
        valueOfC = 42;

    Comparer comparer = new Comparer();

    Console.WriteLine("Das Größere ist \t:{0}",
        comparer.Great(delegate(int a, int b)
        {
            int[] numbers = new int[] { a, b, valueOfC };
            return Math.Max(Math.Max(a, b), valueOfC);
        },
        valueOfA, valueOfB));
}

Hier ist der dekompilierte IL-Code der Main-Methode:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       65 (0x41)
  .maxstack  5
  .locals init ([0] int32 valueOfA,
           [1] int32 valueOfB,
           [2] class Ch04.Comparer comparer,
           [3] class Ch04.Program/'<>c__DisplayClass1' 'CS$<>8__locals2') // Hier ist es    
   ...
}

6voto

Alexei Levenkov Punkte 96742

Wenn nichts zu erfassen ist, erstellt der C#-Compiler eine private Methode in der Klasse. Wenn Sie Variablen im Closure haben, wird eine innere Klasse erstellt.

In Kapitel 12 - Delegates und Lambda-Ausdrücke ausführlich erläutert

int local = 42;
...Where(value => {return true;})... // private method
...Where(value => { return value == local;})... // class

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X