クラス定義の do バインドは、オブジェクトが構築されたとき、または静的 do バインドの場合、型が最初に使用されるときにアクションを実行します。
構文
[static] do expression
注釈
do バインドは、letバインドの前後に、クラス定義のメンバー定義の前に表示されます。
do キーワードは、モジュール レベルのdo バインドでは省略可能ですが、クラス定義のdoバインドでは省略できません。
特定の型のすべてのオブジェクトを構築するために、非静的 do バインドと非静的 let バインドは、クラス定義に表示される順序で実行されます。 1 つの型で複数の do バインドを実行できます。 非静的 let バインドと非静的 do バインドは、プライマリ コンストラクターの本体になります。 非静的 do バインド セクションのコードは、プライマリ コンストラクター パラメーターと、 let バインド セクションで定義されている任意の値または関数を参照できます。
非静的 do バインディングは、クラスにクラス見出しの as キーワードによって定義された自己識別子がある限り、およびそれらのメンバーのすべての使用がクラスの自己識別子で修飾されている限り、クラスのメンバーにアクセスできます。
let バインドはクラスのプライベート フィールドを初期化するため、メンバーが期待どおりに動作することを保証するために必要なことがよくあります。通常、do バインドは、do バインディング内のコードを完全に初期化されたオブジェクトで実行できるように、let バインドの後に配置されます。 初期化が完了する前にコードでメンバーを使用しようとすると、InvalidOperationException が発生します。
静的 do バインドは、外側のクラスの静的メンバーまたはフィールドを参照できますが、インスタンス メンバーやフィールドは参照できません。 静的 do バインドは、クラスの静的初期化子の一部になります。これは、クラスが最初に使用される前に実行することが保証されます。
型の do バインドでは、属性は無視されます。
do バインディングで実行されるコードに属性が必要な場合は、プライマリ コンストラクターに適用する必要があります。
次のコードでは、クラスに静的 do バインドと非静的 do バインドがあります。 オブジェクトには、 a と bの 2 つのパラメーターを持つコンストラクターがあり、クラスの let バインドで 2 つのプライベート フィールドが定義されています。 2 つのプロパティも定義されます。 これらすべての値を出力する行で示されているように、これらはすべて非静的 do バインド セクションのスコープ内にあります。
open System
type MyType(a: int, b: int) as this =
inherit Object()
let x = 2 * a
let y = 2 * b
do printfn "Initializing object %d %d %d %d %d %d" a b x y (this.Prop1) (this.Prop2)
static do printfn "Initializing MyType."
member this.Prop1 = 4 * x
member this.Prop2 = 4 * y
override this.ToString() =
System.String.Format("{0} {1}", this.Prop1, this.Prop2)
let obj1 = new MyType(1, 2)
出力は次のとおりです。
Initializing MyType.
Initializing object 1 2 2 4 8 16
こちらも参照ください
.NET