クラス内の let バインドlet Bindings in Classes

クラス定義のバインディングを使用F# letして、クラスのプライベートフィールドとプライベート関数を定義できます。You can define private fields and private functions for F# classes by using let bindings in the class definition.

構文Syntax

// Field.
[static] let [ mutable ] binding1 [ and ... binding-n ]

// Function.
[static] let [ rec ] binding1 [ and ... binding-n ]

コメントRemarks

前の構文は、クラスの見出しと継承宣言の後、メンバー定義の前に記述されます。The previous syntax appears after the class heading and inheritance declarations but before any member definitions. 構文は、クラスの外部letのバインドの場合と似ていますが、クラスで定義されている名前には、クラスに限定されたスコープがあります。The syntax is like that of let bindings outside of classes, but the names defined in a class have a scope that is limited to the class. バインディングletは、プライベートフィールドまたは関数を作成します。データまたは関数を公開するには、プロパティまたはメンバーメソッドを宣言します。A let binding creates a private field or function; to expose data or functions publicly, declare a property or a member method.

静的でないlet letバインディングは、インスタンスバインディングと呼ばれます。A let binding that is not static is called an instance let binding. インスタンスletバインドは、オブジェクトの作成時に実行されます。Instance let bindings execute when objects are created. 静的letバインディングは、クラスの静的初期化子の一部であり、型が最初に使用される前に確実に実行されることが保証されています。Static let bindings are part of the static initializer for the class, which is guaranteed to execute before the type is first used.

インスタンスletバインド内のコードでは、プライマリコンストラクターのパラメーターを使用できます。The code within instance let bindings can use the primary constructor's parameters.

属性とアクセシビリティ修飾子は、クラスのletバインドでは使用できません。Attributes and accessibility modifiers are not permitted on let bindings in classes.

次のコード例は、クラスのletいくつかの種類のバインドを示しています。The following code examples illustrate several types of let bindings in classes.

type PointWithCounter(a: int, b: int) =
    // A variable i.
    let mutable i = 0

    // A let binding that uses a pattern.
    let (x, y) = (a, b)

    // A private function binding.
    let privateFunction x y = x * x + 2*y

    // A static let binding.
    static let mutable count = 0

    // A do binding.
    do
       count <- count + 1

    member this.Prop1 = x
    member this.Prop2 = y
    member this.CreatedCount = count
    member this.FunctionValue = privateFunction x y

let point1 = PointWithCounter(10, 52)

printfn "%d %d %d %d" (point1.Prop1) (point1.Prop2) (point1.CreatedCount) (point1.FunctionValue)

出力は次のとおりです。The output is as follows.

10 52 1 204

フィールドを作成する別の方法Alternative Ways to Create Fields

また、キーワードを使用valしてプライベートフィールドを作成することもできます。You can also use the val keyword to create a private field. valキーワードを使用する場合、オブジェクトの作成時にフィールドに値は与えられませんが、代わりに既定値を使用して初期化されます。When using the val keyword, the field is not given a value when the object is created, but instead is initialized with a default value. 詳細については、次を参照してください。明示的なフィールド:Val キーワードFor more information, see Explicit Fields: The val Keyword.

メンバー定義を使用し、キーワードprivateを定義に追加することで、クラスのプライベートフィールドを定義することもできます。You can also define private fields in a class by using a member definition and adding the keyword private to the definition. これは、コードを書き直さずにメンバーのアクセシビリティを変更することが予想される場合に便利です。This can be useful if you expect to change the accessibility of a member without rewriting your code. 詳細については、アクセス制御を参照してください。For more information, see Access Control.

関連項目See also