Peter Bucher - Mein Experiment, meine Spielereien, meine Welt...   ·   Stefan Falz   ·   Jürgen Gutsch   ·   Golo Roden   ·   ASP.NET Zone   ·   Microsoft ASP.NET
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Optimierungseinstellung im Reflector, oder: Wie sieht LINQ wirklich aus?

Beim dritten Treffen vom .NET Stammtisch Konstanz - Kreuzlingen habe ich einen Vortrag über LINQ gehalten.
Dabei wollte ich zeigen wie aus dem SQL ähnlichen Syntax von LINQ aneinandergereihte Methoden Aufrufe werden und aus den Lambda Ausdrücken jeweils anonyme Methoden.

Das geht über den Reflector auch wunderbar. Kurz vor dem Vortrag habe ich den Fehler begangen und Windows 7 installiert… nicht das Windows 7 der Fehler gewesen wäre, sondern die Neuinstallation.
So hatte ich vieles noch nicht 100% so wie es war und ausserdem war plötzlich die neuste Version vom Reflector installiert.

Als ich während dem Vortrag den Code demonstrieren wollte, bekamen wir natürlich nur wunderschöne Lambda-Ausdrücke zu sehen, keine anonymen Methoden. Ich wusste nicht wieso und hatte keine Zeit das herauszufinden.

Edit:
LINQ war das natürlich nicht, sondern nur Lambda-Ausdrücke.
Jedoch gilt das genau so für LINQ, dort wird die LINQ-Syntax automatisch vom Kompiler in den Erweiterungemethoden-Syntax + Lambda-Ausdrücke umgewandelt.
Natürlich kann auch von Hand der Erweiterungsmethoden-Syntax benutzt werden, bei einer Bedingung oder wirklich komplexen Aufgaben ist das meist angenehmer.

LINQ-Syntax

public Download GetDownloadByFileName(string fileName)
{
    return (from download in this.GetList()
                  where download.FileName == fileName).SingleOrDefault();
}


Erweiterungsmethoden-Syntax

public Download GetDownloadByFileName(string fileName)
{
    return this.GetList().Where(download => download.FileName == fileName);
}

.NET 3.5

public Download GetDownloadByFileName(string fileName)
{
    return this.GetList(d => d.FileName == fileName).SingleOrDefault();
}

Eigentlich ist es relativ einfach, man gehe im Menü unter: View –> Options –> Disassembler und stellt bei Optimization .NET 2.0 ein, dann sieht es nämlich so aus:

public Download GetDownloadByFileName(string fileName)
{
    return this.GetList(delegate (Download d) {
        return d.FileName == fileName;
    }).SingleOrDefault<Download>();
}

Wird None oder .NET 1.0 eingestellt ist der Code schon fast nicht mehr zu lesen.
Es ist hier gut zu erkennen, was der Kompiler im Hintergrund alles erzeugt damit die oben geschriebene Syntax funktioniert.

public Download GetDownloadByFileName(string fileName)
{
    <>c__DisplayClass1 CS$<>8__locals2;
    Download CS$1$0000;
    CS$<>8__locals2 = new <>c__DisplayClass1();
    CS$<>8__locals2.fileName = fileName;
    CS$1$0000 = this.GetList(new Func<Download, bool>(CS$<>8__locals2.<GetDownloadByFileName>b__0)).SingleOrDefault<Download>();
Label_0028:
    return CS$1$0000;
}

Bearbeitung / Korrekturen:
09.06.09 - Das Codesnippet zu .NET 2.0 war natürlich das falsche, jetzt sieht man auch die anonyme Methode.
09.09.09 - LINQ war ja nicht drin, ist jetzt hinzugefügt ;-)

Veröffentlicht Montag, 8. Juni 2009 20:24 von Peter Bucher
Abgelegt unter: , , , , ,

Kommentare

# re: Optimierungseinstellung im Reflector, oder: Wie sieht LINQ wirklich aus?

Hallo Peter

Kannst Du denn den Vortrag zur Verfügung stellen?

Gruss

Daniel

Dienstag, 9. Juni 2009 05:58 by schaedld

# re: Optimierungseinstellung im Reflector, oder: Wie sieht LINQ wirklich aus?

Hoi Daniel

Wir haben leider keine Aufnahmen davon gemacht.

Für die nächsten Vorträge haben wir Aufnahmen geplant, aber wir sind noch in der Anfangsphase.

Dienstag, 9. Juni 2009 10:46 by Peter Bucher

# re: Optimierungseinstellung im Reflector, oder: Wie sieht LINQ wirklich aus?

Hallo Peter

Du hast ja die Lambda Ausdrücke auf der MSDN verlinkt. Diese verweist auf das Visual Basic Programmierhandbuch und nicht auf das von C# (welche Du ja grundsätzlich brauchst).

Grüss

Daniel

Mittwoch, 10. Juni 2009 07:44 by schaedld

# re: Optimierungseinstellung im Reflector, oder: Wie sieht LINQ wirklich aus?

Hallo Daniel,

>> Du hast ja die Lambda Ausdrücke auf der MSDN

>> verlinkt. Diese verweist auf das Visual

>> Basic Programmierhandbuch und nicht auf das

>> von C# (welche Du ja grundsätzlich brauchst).

Der Sprachfilter in der MSDN ist benutzerabhängig und wird in einem Cookie gespeichert. Der Link selber verweist nur auf den Artikel. Die gewünschte Sprache musst du schon selber aussuchen ;-)

Mittwoch, 10. Juni 2009 07:53 by Jürgen Gutsch

# re: Optimierungseinstellung im Reflector, oder: Wie sieht LINQ wirklich aus?

Hallo zusammen

Jürgen, das stimmt schon, aber ich hatte wirklich ein Link zum "Visual Studio Handbuch" benutzt.

Danke Daniel, ist jetzt korrigiert :)

Mittwoch, 10. Juni 2009 23:58 by Peter Bucher

# Richtig testen, oder: Was ist schneller… Foreach, LAMBDA Expressions, oder LINQ?

Einleitung Der schweizer Kollege Daniel Schädler hat einen Blogpost mit dem Titel “Was ist schneller…

Mittwoch, 9. September 2009 23:43 by Peter Bucher
Anonyme Kommentare sind nicht zugelassen