2010-02-19 67 views
2

简洁F#类对于这个类的定义:定义与后构造逻辑

type Foo(f1: int, f2: string) = 
member x.F1 = f1 
member x.F2 = PostProcess f2 

威尔后处理(一些字符串处理函数)被调用每次F2访问?如果答案是肯定的,我想避免它,那么正确的习惯用法是什么?这是推荐的吗?这对我来说有点过于冗长。

type Foo = 
val F1: int 
val F2: string 

new (f1, f2) as this = 
    {F1 = f1; F2 = f2;} 
    then this.F2 = PostProcess(f2) |> ignore 
+0

可能对任何人登陆此处感兴趣的隐约相关的问题:http://stackoverflow.com/questions/1624571/how-to-invoke-methods-from-constructor-in-f – Benjol 2010-02-22 07:28:46

回答

6

在你最初的定义F2是一个只读属性和​​功能将在每次被访问时调用。这是很容易验证:

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 

以下是我想的类写入只处理一次:

type Foo(f1: int, f2: string) = 
    let pf2 = PostProcess f2 
    member x.F1 = f1 
    member x.F2 = pf2 
+0

完美!我也证实了我自己。你的建议看起来很好,简洁。 – vha14 2010-02-19 19:34:28

1

是,属性重新评估每一个时间(比如就像一个get属性C#)。

请参阅@ kvb的答案,为您的特定问题提供简洁的答案。

通常,参见例如,

http://msdn.microsoft.com/en-us/library/dd233192(VS.100).aspx

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!894.entry

上的最好办法语言信息来编写类的构造函数。简要的总结是你应该使用一个'主构造函数'(就像你有,在类型名称后带有构造函数参数的parens),然后在类的顶部使用letdo作为构造函数体。

+0

感谢Brian的指点。我刚开始使用F#的OOP方面。 – vha14 2010-02-19 19:36:50