Strukturen (F#)

Eine Struktur ist ein kompakter Objekttyp, der für Typen mit einer geringen Menge an Daten und einfachem Verhalten effizienter als eine Klasse sein kann.

[ attributes ]
type [accessibility-modifier] type-name =
   struct
      type-definition-elements
   end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
   type-definition-elements

Hinweise

Strukturen sind Werttypen. Dies bedeutet, dass sie direkt auf dem Stapel oder, wenn sie als Felder oder Arrayelemente verwendet werden, inline im übergeordneten Typ gespeichert werden. Im Gegensatz zu Klassen und Datensätzen verfügen Strukturen über eine Semantik für die Übergabe als Wert. Dies bedeutet, dass sie hauptsächlich für kleine Aggregate von Daten sinnvoll sind, auf die häufig zugegriffen wird und die häufig kopiert werden.

In der vorherigen Syntax werden zwei Formen gezeigt. Die erste Form ist nicht die einfache Syntax, jedoch wird sie trotzdem häufig verwendet, da Sie das StructAttribute-Attribut, das in der zweiten Form vorhanden ist, weglassen können, wenn Sie das struct-Schlüsselwort und das end-Schlüsselwort verwenden. Sie können für StructAttribute die Abkürzung Struct verwenden.

Die type-definition-elements in der vorherigen Syntax stellen Memberdeklarationen und -definitionen dar. Strukturen können über Konstruktoren und änderbare sowie unveränderliche Felder verfügen, und sie können Member und Schnittstellenimplementierungen deklarieren. Weitere Informationen finden Sie unter Member (F#).

Strukturen können nicht geerbt werden, können keine let- oder do-Bindungen enthalten und können nicht rekursiv Felder des eigenen Typs enthalten (obwohl sie Referenzzellen enthalten können, die auf den eigenen Typ verweisen).

Da Strukturen keine let-Bindungen zulassen, müssen Sie Felder in Strukturen mit dem val-Schlüsselwort deklarieren. Das val-Schlüsselwort definiert ein Feld und seinen Typ, es lässt jedoch keine Initialisierung zu. Stattdessen werden val-Deklarationen mit 0 (null) oder NULL initialisiert. Aus diesem Grund erfordern Strukturen, die über einen impliziten Konstruktor (Parameter, die in der Deklaration direkt nach dem Strukturnamen angegeben werden) verfügen, dass val-Deklarationen mit dem DefaultValue-Attribut gekennzeichnet werden. Strukturen mit einem definierten Konstruktor unterstützen dennoch die Initialisierung mit 0 (null). Daher deklariert das DefaultValue-Attribut, dass der Wert 0 (null) für das Feld gültig ist. Implizite Konstruktoren für Strukturen führen keine Aktionen aus, da let-Bindungen und do-Bindungen für den Typ zulässig sind, die übergebenen impliziten Konstruktorparameterwerte sind jedoch als private Felder verfügbar.

Explizite Konstruktoren erfordern möglicherweise die Initialisierung von Feldwerten. Wenn eine Struktur über einen expliziten Konstruktor verfügt, unterstützt sie dennoch die Initialisierung mit null (0). Jedoch wird das DefaultValue-Attribut in val-Deklarationen nicht verwendet, da es einen Konflikt mit dem expliziten Konstruktor verursacht. Weitere Informationen zu val-Deklarationen finden Sie unter Explizite Felder: Das val-Schlüsselwort (F#).

Attribute und Zugriffsmodifizierer sind für Strukturen zulässig, und für sie gelten die gleichen Regeln wie für andere Typen. Weitere Informationen finden Sie unter Attribute (F#) und Zugriffssteuerung (F#).

In den folgenden Codebeispielen werden Strukturdefinitionen veranschaulicht.

// In Point3D, three immutable values are defined.
// x, y, and z will be initialized to 0.0.
type Point3D =
   struct
      val x: float
      val y: float
      val z: float
   end

// In Point2D, two immutable values are defined.
// Point2D has an explicit constructor.
// You can create zero-initialized instances of Point2D, or you can
// pass in arguments to initialize the values.
type Point2D =
   struct
      val X: float
      val Y: float
      new(x: float, y: float) = { X = x; Y = y }
   end

Siehe auch

Referenz

Klassen (F#)

Datensätze (F#)

Konzepte

Member (F#)

Weitere Ressourcen

F#-Sprachreferenz