類別中的 do 繫結

類別定義中的 do 繫結會在建構物件時執行動作,或在第一次使用類型時,針對靜態 do 繫結執行動作。

語法

[static] do expression

備註

do 繫結會與 let 繫結一起出現,或在該繫結之後但在類別定義中的成員定義之前出現。 雖然 do 關鍵字對於模組層級的 do 繫結而言為選擇性,但對於類別定義中的 do 繫結就並非選擇性。

針對任何指定類型的每個物件建構,非靜態 do 繫結與非靜態 let 繫結會依類別定義中出現的順序執行。 多個 do 繫結可發生在同一種類型中。 非靜態 let 繫結與非靜態 do 繫結會成為主要建構函式的主體。 非靜態 do 繫結區段中的程式碼可以參考主要建構函式參數,以及 let 繫結區段中定義的任何值或函式。

只要類別具有類別標題中的 as 關鍵字所定義的自我識別碼,且只要這些成員的所有使用方式都以類別的自我識別碼限定,則非靜態 do 繫結就可以存取類別的成員。

因為 let 繫結會初始化類別的私人欄位 (其通常必須保證成員如預期般運作),所以 do 繫結通常會放在 let 繫結之後,讓 do 繫結中的程式碼可以使用完全初始化的物件來執行。 若您的程式碼嘗試在初始化完成之前使用成員,則會引發 InvalidOperationException。

靜態 do 繫結可以參考封入類別的靜態成員或欄位,但不能參考執行個體成員或欄位。 靜態 do 繫結為該類別之靜態初始設定式的一部分,其保證會在首次使用該類型之前執行。

類型中的 do 繫結會忽略屬性。 若 do 繫結中執行的程式碼需要屬性,則必須將其套用至主要建構函式。

在下列程式碼中,類別具有靜態 do 繫結與非靜態 do 繫結。 物件有具備兩個參數的建構函式 (ab),以及兩個定義於類別 let 繫結中的私用欄位。 也會定義兩個屬性。 所有這些屬性都位於非靜態 do 繫結區段中的範圍內,如列印所有這些值的行所說明。

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)

輸出如下。

Initializing MyType.
Initializing object 1 2 2 4 8 16

另請參閱