Freigeben über


Typdeklarationen

Q# unterstützt benutzerdefinierte struct Typen. struct Typen ähneln Datensatztypen in F#; sie sind unveränderlich, unterstützen aber ein -Konstrukts kopieren und aktualisieren.

Strukturtypen

struct Typen können nur benannte Elemente enthalten und anonyme Elemente nicht unterstützen. Eine beliebige Kombination benannter Elemente wird unterstützt, obwohl Elemente nicht geschachtelt werden können.

Die folgende Deklaration definiert z. B. eine Struktur Complex mit zwei benannten Elementen Real und Imaginary, die beide vom Typ Doublesind:

struct Complex {
    Real : Double,
    Imaginary : Double,
}

Sie können über ihren Namen oder über Destrukturierung auf die enthaltenen Elemente zugreifen (weitere Informationen finden Sie unter Elementzugriff). Sie können auch auf ein Tupel aller Elemente zugreifen, bei denen das Shape mit dem in der Deklaration definierten Element über den unwrap-Operatorübereinstimmt.

struct Typen sind aus zwei Gründen nützlich. Solange die Bibliotheken und Programme, die die definierten Typen verwenden, nicht über die Dekonstruktion, sondern über ihren Namen auf Elemente zugreifen, kann der Typ erweitert werden, um später zusätzliche Elemente zu enthalten, ohne Bibliothekscode zu unterbrechen. Aus diesem Grund wird der Zugriff auf Elemente über die Dekonstruktion abgeraten.

Zweitens können Sie Q# die Absichten und Erwartungen für einen bestimmten Datentyp vermitteln, da keine automatische Konvertierung zwischen Werten von zwei struct Typen vorhanden ist, auch wenn ihre Elementtypen identisch sind.

Strukturkonstruktoren

Der Compiler generiert automatisch Konstruktoren für neue struct Typen, wenn er eine struct Definition liest. Für die Complex-Anweisung im vorherigen Beispiel können Sie eine Instanz mit

let complexPair = Complex(1.4, 2.1);

Sie können Instanzen auch mit dem schlüsselwort new definieren, z. B.

let complexPair = new Complex { Real = 1.4, Imaginary = 2.1 };

Sie können eine vorhandene Struktur mit der ...-Syntax kopieren.

let copyPair = new Complex { ...complexPair };

Beim Kopieren können Sie einzelne zu ändernde Felder angeben.

let updatedPair = new Complex { ...complexPair, Real = 3.5 };