类中的 do 绑定 (F#)
构造对象时,类定义中的 do 绑定可以执行相关操作;第一次使用类型时,静态 do 绑定可以执行相关操作。
[static] do expression
备注
do 绑定可与 let 绑定一起出现,或者也可以在 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