在类中执行绑定

do类定义中的绑定在构造对象时执行作,或者在首次使用类型时对静态do绑定执行作。

语法

[static] do expression

注解

do绑定与绑定或绑定之后let一起显示,但在类定义中的成员定义之前。 尽管该 do 关键字对于 do 模块级别的绑定是可选的,但它对于 do 类定义中的绑定来说不是可选的。

对于任何给定类型的每个对象的构造,将按照类定义中显示的顺序执行非静态 do 绑定和非静态 let 绑定。 多个 do 绑定可以在一种类型中发生。 非静态 let 绑定和非静态 do 绑定将成为主构造函数的主体。 非静态 do 绑定节中的代码可以引用主构造函数参数以及绑定节中 let 定义的任何值或函数。

只要类具有由类标题中的关键字定义的as自标识符,并且只要这些成员的所有用法都使用类的自标识符进行限定,则非静态do绑定可以访问该类的成员。

由于let绑定初始化类的私有字段,因此通常有必要保证成员的行为符合预期,因此绑定通常在绑定后let放置,do以便绑定中的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

另请参阅