類別中的 do 繫結 (F#)
類別定義中的 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 繫結。物件有包含兩個參數 a 和 b 的建構函式,而且兩個私用欄位是定義於類別的 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