göra bindningar i klasser
En do
bindning i en klassdefinition utför åtgärder när objektet konstrueras eller, för en statisk do
bindning, när typen först används.
Syntax
[static] do expression
Kommentarer
En do
bindning visas tillsammans med eller efter let
bindningar men före medlemsdefinitioner i en klassdefinition. Även om nyckelordet do
är valfritt för do
bindningar på modulnivå är det inte valfritt för do
bindningar i en klassdefinition.
Vid konstruktion av varje objekt av en viss typ körs icke-statiska do
bindningar och icke-statiska let
bindningar i den ordning de visas i klassdefinitionen. Flera do
bindningar kan ske i en typ. Icke-statiska let
bindningar och icke-statiska do
bindningar blir brödtexten för den primära konstruktorn. Koden i avsnittet icke-statiska do
bindningar kan referera till de primära konstruktorparametrarna och alla värden eller funktioner som definieras i let
avsnittet bindningar.
Icke-statiska do
bindningar kan komma åt medlemmar i klassen så länge klassen har en självidentifierare som definieras av ett as
nyckelord i klassrubriken, och så länge alla användningar av dessa medlemmar är kvalificerade med självidentifieraren för klassen.
Eftersom let
bindningar initierar de privata fälten i en klass, vilket ofta är nödvändigt för att garantera att medlemmar beter sig som förväntat, do
placeras bindningar vanligtvis efter let
bindningar så att kod i bindningen do
kan köras med ett helt initierat objekt. Om koden försöker använda en medlem innan initieringen är klar utlöses en InvalidOperationException.
Statiska do
bindningar kan referera till statiska medlemmar eller fält i den omslutande klassen men inte instansmedlemmar eller fält. Statiska do
bindningar blir en del av den statiska initieraren för klassen, som garanterat körs innan klassen först används.
Attribut ignoreras för do
bindningar i typer. Om ett attribut krävs för kod som körs i en do
bindning måste det tillämpas på den primära konstruktorn.
I följande kod har en klass en statisk do
bindning och en icke-statisk do
bindning. Objektet har en konstruktor som har två parametrar och a
b
, och två privata fält definieras i let
bindningarna för klassen. Två egenskaper definieras också. Alla dessa finns i omfånget i avsnittet icke-statiska do
bindningar, vilket illustreras av raden som skriver ut alla dessa värden.
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)
Utdata är följande.
Initializing MyType.
Initializing object 1 2 2 4 8 16