do-Bindungen in Klassen
Eine do
-Bindung in einer Klassendefinition führt Aktionen aus, wenn das Objekt erstellt wird oder bei einer statischen do
-Bindung, wenn der Typ zum ersten Mal verwendet wird.
Syntax
[static] do expression
Bemerkungen
Eine do
-Bindung wird zusammen mit oder nach let
-Bindungen, aber vor Memberdefinitionen in einer Klassendefinition angezeigt. Obwohl das do
-Schlüsselwort für do
-Bindungen auf Modulebene optional ist, ist sie für do
-Bindungen in einer Klassendefinition nicht optional.
Bei der Konstruktion jedes Objekts eines bestimmten Typs werden nicht statische do
-Bindungen und nicht statische let
-Bindungen in der Reihenfolge ausgeführt, in der sie in der Klassendefinition angezeigt werden. In einem Typ können mehrere do
-Bindungen auftreten. Die nicht statischen let
-Bindungen und die nicht statischen do
-Bindungen werden zum Hauptteil des primären Konstruktors. Der Code im Abschnitt nicht statische do
-Bindungen kann auf die primären Konstruktorparameter und alle Werte oder Funktionen verweisen, die im Abschnitt let
-Bindungen definiert sind.
Nicht statische do
-Bindungen können auf Member der Klasse zugreifen, solange die Klasse über einen Selbstbezeichner verfügt, der durch ein as
-Schlüsselwort in der Klassenüberschrift definiert wird, und solange alle Verwendungen dieser Member mit dem Selbstbezeichner für die Klasse qualifiziert sind.
Da let
-Bindungen die privaten Felder einer Klasse initialisieren, was häufig erforderlich ist, um sicherzustellen, dass Member sich wie erwartet verhalten, werden do
-Bindungen in der Regel nach let
-Bindungen platziert, sodass Code in der do
-Bindung mit einem vollständig initialisierten Objekt ausgeführt werden kann. Wenn Ihr Code versucht, ein Element zu verwenden, bevor die Initialisierung abgeschlossen ist, wird eine InvalidOperationException ausgelöst.
Statische do
-Bindungen können auf statische Member oder Felder der einschließenden Klasse verweisen, aber nicht auf Instanz-Member oder -Felder. Statische do
-Bindungen werden Teil des statischen Initialisierers für die Klasse, der garantiert ausgeführt wird, bevor die Klasse zum ersten Mal verwendet wird.
Attribute werden bei do
-Bindungen in Typen ignoriert. Wenn ein Attribut für Code erforderlich ist, der in einer do
-Bindung ausgeführt wird, muss es auf den primären Konstruktor angewendet werden.
Im folgenden Code weist eine Klasse eine statische do
-Bindung und eine nicht statische do
-Bindung auf. Das Objekt verfügt über einen Konstruktor mit zwei Parametern, a
und b
, und zwei private Felder sind in den let
-Bindungen für die Klasse definiert. Außerdem werden zwei Eigenschaften definiert. Alle diese Elemente befinden sich im Bereich des Abschnitts nicht statische do
-Bindungen, wie die Zeile veranschaulicht, die alle diese Werte ausgibt.
open System
type MyType(a: int, b: int) as this =
inherit Object()
let x = 2 * a
let y = 2 * b
do printfn "Initializing object %d %d %d %d %d %d" a b x y (this.Prop1) (this.Prop2)
static do printfn "Initializing MyType."
member this.Prop1 = 4 * x
member this.Prop2 = 4 * y
override this.ToString() =
System.String.Format("{0} {1}", this.Prop1, this.Prop2)
let obj1 = new MyType(1, 2)
Die Ausgabe lautet wie folgt.
Initializing MyType.
Initializing object 1 2 2 4 8 16