Share via


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

Siehe auch