Share via


do-Bindungen in Klassen (F#)

Eine do-Bindung in einer Klassendefinition führt Aktionen aus, wenn das Objekt erstellt wird, oder, bei einer statischen do-Bindung, wenn der Typ das erste Mal verwendet wird.

[static] do expression

Hinweise

Eine do-Bindung wird in einer Klassendefinition zusammen mit let-Bindungen oder nach diesen, jedoch vor Memberdefinitionen angegeben. Das do-Schlüsselwort ist zwar für do-Bindungen auf Modulebene optional, jedoch ist es für do-Bindungen in einer Klassendefinition nicht optional.

Für die Konstruktion jedes Objekts eines angegebenen Typs werden nicht statische do-Bindungen und nicht statische let-Bindungen in der Reihenfolge ausgeführt, in der sie in der Klassendefinition enthalten sind. Ein Typ kann mehrere do-Bindungen enthalten. Aus den nicht statischen let-Bindungen und den nicht statischen do-Bindungen wird der Text des primären Konstruktors. Der Code im Abschnitt der nicht statischen do-Bindungen kann auf die Parameter des primären Konstruktors und Werte oder Funktionen verweisen, die ggf. im Abschnitt der 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 ist, und solange alle Verwendungen dieser Member mit dem Selbstbezeichner für die Klasse qualifiziert werden.

Da let-Bindungen die privaten Felder einer Klasse initialisieren (dies ist häufig erforderlich, um das erwartungsgemäße Verhalten der Member sicherzustellen), werden do-Bindungen i. d. R. nach let-Bindungen angeordnet, damit Code in der do-Bindung mit einem vollständig initialisierten Objekt ausgeführt werden kann. Wenn der Code versucht, einen Member zu verwenden, bevor die Initialisierung abgeschlossen wurde, wird eine InvalidOperationException ausgelöst.

Statische do-Bindungen können auf statische Member oder statische Felder der einschließenden Klasse verweisen, jedoch nicht auf Instanzmember oder Instanzfelder. Statische do-Bindungen werden Bestandteile des statischen Initialisierers für die Klasse, der auf jeden Fall vor der ersten Verwendung der Klasse ausgeführt wird.

Für do-Bindungen in Typen werden Attribute 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 verfügt eine Klasse über eine statische do-Bindung und eine nicht statische do-Bindung. Das Objekt verfügt über einen Konstruktor mit den beiden Parametern a und b, und in den let-Bindungen für die Klasse werden zwei private Felder definiert. Es werden außerdem zwei Eigenschaften definiert. Der Gültigkeitsbereich aller dieser Elemente umfasst den Abschnitt der nicht statischen do-Bindungen, wie durch 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

Referenz

Klassen (F#)

let-Bindungen in Klassen (F#)

do-Bindungen (F#)

Konzepte

Member (F#)

Konstruktoren (F#)