Einanonymer Typ ist ein namenloserDatentyp, der nur im aktuellen Gültigkeitsbereich bekannt und verweisbar ist.
Die XML-StrukturdefinitionsspracheXML Schema sieht vor, dass man in einem benannten Element einen unbenannten (anonymen) komplexen Typinhalt definieren kann.
In den ProgrammiersprachenC# undVisual Basic .NET stellen dieCompiler seit .NET Framework 3 eine Möglichkeit bereit, im aktuellen Gültigkeitsbereich ein anonymes Objekt mit benannten Eigenschaften zu erstellen.
In der StrukturdefinitionsspracheXML Schema kann ein anonymer Typ als Teil der Definition einesXML-Elements definiert werden.[1] Häufig wird dies bei Definitionen von Listen verwendet, wie im folgenden Beispiel.
<xsd:elementname="rechnung"><xsd:complexType><xsd:sequence><xsd:elementname="posten"maxOccurs="unbounded"><xsd:complexType><xsd:sequence><xsd:elementname="artikelnummer"type="xsd:string"/><xsd:elementname="anzahl"type="xsd:integer"/></xsd:sequence></xsd:complexType></xsd:element></xsd:sequence></xsd:complexType></xsd:element>
Hier gibt es zwar Elementnamen für einzelnen Rechnungsposten, die Liste selbst taucht jedoch nicht als Element auf, wie im folgenden Beispiel, das ein XML-Dokument darstellt, welches dem zuvor definierten Schema entspricht.
<rechnung><posten><artikelnummer>23</artikelnummer><anzahl>3</anzahl></posten><posten><artikelnummer>42</artikelnummer><anzahl>5</anzahl></posten></rechnung>
Mit anonymen Typen stellen die Sprachcompiler die Möglichkeit bereit, ein einfaches Objekt mit Eigenschaften zu erstellen, ohne es in einer separaten Datei als Klasse definieren zu müssen. Dazu wird die Variable mit 'var' deklariert.
Beispiel in C#:
varPerson=new{Vorname="Hans",Name="Graf",Schuhgröße=40};
Mit den anonymen Typen kann man auch vordefinierte Klassen instanzieren. Die Eigenschaften des anonymen Objekts werden den öffentlichen Eigenschaften der neu instanzierten Klasse zugewiesen.Angenommen es existiert die Klasse Person mit den öffentlichen Eigenschaften Vorname, Name und Schuhgröße:
PersonmeinePerson=newPerson(){Vorname="Hans",Name="Graf",Schuhgröße=40};
Es ist auch möglich, Arrays mit der anonymen Typ-Syntax zu initialisieren:
Person[]meinePersonen=newPerson[]{newPerson{Vorname="Hans",Name="Graf",Schuhgröße=40},newPerson{Vorname="Anne",Name="Schneider",Schuhgröße=38}};
Bei der Initialisierung von Dictionary<T> wird die Syntax mit anonymen Typen ebenfalls vereinfacht:
Dictionary<string,Person>IdPersonen=newDictionary<string,Person>(){{"id_0",newPerson{Vorname="Hans",Name="Graf"},{"id_1",newPerson{Vorname="Anne",Name="Schneider"}};
Tatsächlich sollte die Anwendung dieser Methode nicht übertrieben werden, da bei jeder Definition ein neuer Typ generiert (TypeBuilder) und instanziert wird.
Anonyme (generierte) Typen in .NET Framework sind direkt vererbt von System.Object, können nicht geerbt werden und die Eigenschaften werden ausschließlich mit get_-Accessor generiert, d. h. man kann nicht vor einer Schleife den Typ definieren und innerhalb der Schleife die Eigenschaften-Werte ändern.
Möchte man eine Funktion definieren, die einen anonymen Typ als Parameter annimmt, muss man den Funktionsparameter als System.Object definieren und seine Eigenschaften mittelsReflexion auslesen.