类中的 let 绑定 (F#)

可以通过使用类定义中的 let 绑定,为 F# 类定义私有字段和私有函数。

// Field.
[static] let [ mutable ] binding1 [ and ... binding-n ]

// Function.
[static] let [ rec ] binding1 [ and ... binding-n ]

备注

上面的语法显示在类标题和继承声明之后,但显示在任何成员定义之前。 该语法类似于类外部的 let 绑定的语法,但类中定义的名称的作用域限制在该类中。 let 绑定可创建私有字段或私有函数;若要公开数据或函数,请声明属性或成员方法。

非静态的 let 绑定称为实例 let 绑定。 创建对象时将执行实例 let 绑定。 静态的 let 绑定是类的静态初始值设定项的一部分,这可保证在首次使用相应的类型之前执行这些绑定。

实例 let 绑定中的代码可以使用主构造函数的参数。

不允许对类中的 let 绑定使用特性和可访问性修饰符。

下面的代码示例演示了类中的若干 let 绑定类型。

type PointWithCounter(a: int, b: int) =
    // A variable i.
    let mutable i = 0

    // A let binding that uses a pattern.
    let (x, y) = (a, b)

    // A private function binding.
    let privateFunction x y = x * x + 2*y

    // A static let binding.
    static let mutable count = 0

    // A do binding.
    do
       count <- count + 1

    member this.Prop1 = x
    member this.Prop2 = y
    member this.CreatedCount = count
    member this.FunctionValue = privateFunction x y

let point1 = PointWithCounter(10, 52)

printfn "%d %d %d %d" (point1.Prop1) (point1.Prop2) (point1.CreatedCount) (point1.FunctionValue)

输出如下所示。

10 52 1 204

创建字段的替代方法

您还可以使用 val 关键字来创建私有字段。 如果使用 val 关键字,则在创建对象时不会为该字段指定值,而是用默认值进行初始化。 有关更多信息,请参见显式字段:val 关键字 (F#)

也可以通过使用成员定义并将关键字 private 添加到定义中,来在类中定义私有字段。 如果您希望在不重写代码的情况下更改成员的可访问性,这会十分有用。 有关更多信息,请参见访问控制 (F#)

请参见

参考

类中的 do 绑定 (F#)

let 绑定 (F#)

概念

成员 (F#)