Anonymer Datentyp

Ein anonymer Typ ist ein namenloser Datentyp, der nur im aktuellen Gültigkeitsbereich bekannt und verweisbar ist.

Die XML-Strukturdefinitionssprache XML Schema sieht vor, dass man in einem benannten Element einen unbenannten (anonymen) komplexen Typinhalt definieren kann.

In den Programmiersprachen C# und Visual Basic .NET stellen die Compiler seit .NET Framework 3 eine Möglichkeit bereit, im aktuellen Gültigkeitsbereich ein anonymes Objekt mit benannten Eigenschaften zu erstellen.

Anonyme Typen in XML Schema

In der Strukturdefinitionssprache XML Schema kann ein anonymer Typ als Teil der Definition eines XML-Elements definiert werden.[1] Häufig wird dies bei Definitionen von Listen verwendet, wie im folgenden Beispiel.

  <xsd:element name="rechnung">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="posten" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="artikelnummer" type="xsd:string" />
              <xsd:element name="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>

Anonyme Typen in C# 3 und Visual Basic 9

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#:

var Person = 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:

Person meinePerson = new Person() { Vorname = "Hans", Name = "Graf", Schuhgröße = 40 };

Es ist auch möglich, Arrays mit der anonymen Typ-Syntax zu initialisieren:

Person[] meinePersonen = new Person[] {
  new Person { Vorname = "Hans", Name = "Graf", Schuhgröße = 40 },
  new Person { 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 = new Dictionary<string, Person>() {
  { "id_0", new Person { Vorname = "Hans", Name = "Graf" },
  { "id_1", new Person { 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 mittels Reflexion auslesen.

Einzelnachweise

  1. XML Schema Part 0: Primer Second Edition: 2.4 Anonymous Type Definitions. Abgerufen am 29. November 2009.