奇数与初始化成员变量

时间:2013-08-28 21:27:26

标签: f#

我习惯于保持对象的成员变量,除非它们被更改。因此,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的初始化程序再次被调用,因为我检查它的值?什么是阻止它做这件事的最佳方法?使用访问者功能?

1 个答案:

答案 0 :(得分:4)

从属性的MSDN页面:

  

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

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

member val x = gensym s