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 ab, 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

Se även