3

我习惯于对象的成员变量保持它们的值,除非它们被改变。所以 F# 中的以下行为有点令人惊讶:(我有一个有 2 个成员的类,第二个据说是通过调用 gensym 函数在构造函数中初始化的)

let mutable gen_base = 0
let gensym prefix = 
  gen_base <- gen_base+1;
  prefix + gen_base.ToString()

type C(m:int, s:string) =
  member this.mm = m;
  member this.x = gensym s
  override this.ToString() = (this.mm.ToString()) + ", " + (this.x.ToString())

let testC = 
  let c = new C(1,"a")
  printfn "c= %A" (c.ToString())
  printfn "c again = %A" (c.ToString())

打印以下内容:

c= "1, a1"
c again = "1, a2"

为什么仅仅因为我检查了它的值而再次调用成员 x 的初始化程序?阻止它这样做的最好方法是什么?使用访问器功能?

4

1 回答 1

4

从关于属性的MSDN页面:

请注意,初始化自动实现的属性的表达式仅在初始化时评估,而不是在每次访问该属性时评估。此行为与显式实现的属性的行为形成对比。

this.x被显式初始化,这意味着每次访问它时都会对其进行评估。要将其转换为自动初始化的属性,您必须将其更改为:

member val x = gensym s
于 2013-08-28T21:43:46.083 回答