对于此类定义:
type Foo(f1: int, f2: string) =
member x.F1 = f1
member x.F2 = PostProcess f2
Run Code Online (Sandbox Code Playgroud)
每次访问f2时都会调用PostProcess(一些字符串操作函数)吗?如果答案是肯定的,我想避免它,那么什么是正确的习惯用法?这个是推荐的吗?这对我来说有点过于冗长.
type Foo =
val F1: int
val F2: string
new (f1, f2) as this =
{F1 = f1; F2 = f2;}
then this.F2 = PostProcess(f2) |> ignore
Run Code Online (Sandbox Code Playgroud)
在您的原始定义中F2是一个只读属性,PostProcess每次访问该函数时都会调用该函数.这很容易验证:
let PostProcess s = printfn "%s" s; s
type Foo(f1: int, f2: string) =
member x.F1 = f1
member x.F2 = PostProcess f2
let f = Foo(1,"test")
let s1 = f.F2
let s2 = f.F2
Run Code Online (Sandbox Code Playgroud)
这是我如何编写只处理一次的类:
type Foo(f1: int, f2: string) =
let pf2 = PostProcess f2
member x.F1 = f1
member x.F2 = pf2
Run Code Online (Sandbox Code Playgroud)