我习惯于保持对象的成员变量,除非它们被更改。因此,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的初始化程序再次被调用,因为我检查它的值?什么是阻止它做这件事的最佳方法?使用访问者功能?
答案 0 :(得分:4)
从属性的MSDN页面:
请注意,初始化自动实现的属性的表达式仅在初始化时进行评估,而不是每次访问属性时都进行评估。此行为与显式实现的属性的行为形成对比。
this.x
已明确初始化,这意味着每次访问它时都会对其进行评估。
要将其转换为自动初始化的属性,您必须将其更改为:
member val x = gensym s