2

このクラス定義の場合:

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

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
4

2 に答える 2

6

元の定義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

一度だけ処理するクラスを作成する方法は次のとおりです。

type Foo(f1: int, f2: string) =
  let pf2 = PostProcess f2
  member x.F1 = f1
  member x.F2 = pf2
于 2010-02-19T19:22:12.397 に答える
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

クラスコンストラクターを作成するための最良の方法に関する言語情報。簡潔にまとめると、「プライマリコンストラクター」(コンストラクター引数をとる型名の直後のパラメーター)を使用letdoてから、クラスの先頭でコンストラクター本体として使用する必要があります。

于 2010-02-19T19:26:26.010 に答える