Frage

Ich habe viele Beschreibungen gesehen, wie anonyme Typen funktionieren, bin mir aber nicht sicher, wie nützlich sie wirklich sind.Welche Szenarien können mit anonymen Typen in einem gut gestalteten Programm behandelt werden?

War es hilfreich?

Lösung

Anonyme Typen haben nichts mit dem Design von Systemen oder sogar mit der Klassenebene zu tun.Sie sind ein Werkzeug, das Entwickler beim Codieren verwenden können.

Ich behandle anonyme Typen nicht einmal als Typen per se.Ich verwende sie hauptsächlich als anonyme Tupel auf Methodenebene.Wenn ich die Datenbank abfrage und dann die Ergebnisse manipuliere, erstelle ich lieber einen anonymen Typ und verwende diesen, anstatt einen völlig neuen Typ zu deklarieren, der außerhalb des Bereichs meiner Methode niemals verwendet oder bekannt wird.

Zum Beispiel:

var query = from item in database.Items
            // ...
            select new { Id = item.Id, Name = item.Name };

return query.ToDictionary(item => item.Id, item => item.Name);

Niemand kümmert sich um „a“, den anonymen Typ.Es ist vorhanden, sodass Sie keine weitere Klasse deklarieren müssen.

Andere Tipps

Aus LINQ in Aktion (Seite 76, Abschnitt 2.6.3):

...Anonyme Typen [sind] ein großartiges Werkzeug für schnelle und einfache temporäre Ergebnisse.Dank temporärer Typen müssen wir keine Klassen deklarieren, um temporäre Ergebnisse zu speichern.

Grundsätzlich sind sie nützlich, um Informationen vorübergehend im lokalen Bereich zu halten.Alles darüber hinaus erfordert den Einsatz von Reflexion und kann zu einem ziemlichen Problem werden.Das Beispiel, das sie in dem oben zitierten Buch geben, besteht darin, schriftlich die ID, den Namen und die Menge an Speicher zu trösten, die von jedem laufenden Prozess belegt wird.Sie erstellen einen anonymen Typ, fügen ihn einer Liste hinzu (alles in einer Anweisung) und verwenden dann ObjectDumper, um ihn auszugeben.Daher benötigt der Code keine separat deklarierte Klasse mehr, um die ID, den Namen und den verwendeten Speicher zu speichern, sondern alles wird implizit deklariert, wodurch die Zeilenanzahl auf 4 gesenkt wird:

var pl = new List<Object>();
foreach(var p in Process.GetProcesses())
  pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64});
ObjectDumper.Write(pl);

Anonyme Typen werden am häufigsten zum Angeben von Projektionen in einer LINQ to SQL-Abfrage verwendet.

Diese Abfrage

from x in db.Table1 select new {x.Column1, Alias2=x.Column2}

wird in dieses SQL konvertiert:

SELECT Column1, Column2 AS Alias2 FROM Table1

Mit anonymen Typen können Sie Ad-hoc-Projektionen erstellen, ohne vorher den Typ dafür zu definieren.Der Compiler definiert den Typ für Sie.

Wenn Sie Typen für „Verwenden und Werfen“-Zwecke erstellen.Dies scheint auf LINQ zurückzuführen zu sein.Scheint eine Möglichkeit zu sein, Strukturen mit Feldern für eine LINQ-Abfrage im laufenden Betrieb zu erstellen.Gibt eine Struktur/einen Typ nur mit angegebenen Feldern zurück.Andernfalls müssten Sie für jede eindeutige Kombination von Feldern, die Sie abrufen möchten, einen .Net-Typ deklarieren.

Verwenden Sie sie mit Linq.

Es ist wichtig zu wissen, dass LINQ Sie nicht dazu zwingt, anonyme Typen zu verwenden.Sie können nach der Auswahl auch normale Objektkonstruktionen schreiben.

var query = from item in database.Items
// ...
select new Person(item.id, item.Name)

Dies verhindert eine hässliche Reflexionsprogrammierung.

@Wouter:

var query = from item in database.Items
select new Person
{
ID =item.id,
NAME= item.Name
};

Dabei sind ID und NAME echtes Eigentum Ihrer Personenklasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top