次の方法で共有


オブジェクト式

オブジェクト式は、既存の基本型、インターフェイス、またはインターフェイスのセットに基づいて生成された匿名オブジェクト型のコンパイラの新しいインスタンスを作成する式です。

構文

// When typename is a class:
{ new typename [type-params]arguments with
    member-definitions
    [ additional-interface-definitions ]
}
// When typename is not a class:
{ new typename [generic-type-args] with
    member-definitions
    [ additional-interface-definitions ]
}

注釈

前の構文では、 typename は既存のクラス型またはインターフェイス型を表します。 type-params は、 省略可能なジェネリック型パラメーターを記述します。 引数は、コンストラクター パラメーターを必要とするクラス型にのみ使用されます。 メンバー定義は、基底クラスメソッドのオーバーライド、または基底クラスまたはインターフェイスからの抽象メソッドの実装です。

次の例は、さまざまな種類のオブジェクト式を示しています。

// This object expression specifies a System.Object but overrides the
// ToString method.
let obj1 = { new System.Object() with member x.ToString() = "F#" }
printfn $"{obj1}"

// This object expression implements the IFormattable interface.
let delimiter(delim1: string, delim2: string, value: string) =
    { new System.IFormattable with
        member x.ToString(format: string, provider: System.IFormatProvider) =
            if format = "D" then
                delim1 + value + delim2
            else
                value }

let obj2 = delimiter("{","}", "Bananas!");

printfn "%A" (System.String.Format("{0:D}", obj2))

// Define two interfaces
type IFirst =
  abstract F : unit -> unit
  abstract G : unit -> unit

type ISecond =
  inherit IFirst
  abstract H : unit -> unit
  abstract J : unit -> unit

// This object expression implements both interfaces.
let implementer() =
    { new ISecond with
        member this.H() = ()
        member this.J() = ()
      interface IFirst with
        member this.F() = ()
        member this.G() = () }

オブジェクト式の使用

新しい名前付き型を作成するために必要な追加のコードとオーバーヘッドを回避する場合は、オブジェクト式を使用します。 オブジェクト式を使用してプログラムで作成される型の数を最小限に抑える場合は、コード行の数を減らし、型の不必要な急増を防ぐことができます。 特定の状況を処理するためだけに多くの型を作成する代わりに、既存の型をカスタマイズしたり、特定のケースに適したインターフェイスの実装を提供したりするオブジェクト式を使用できます。

こちらも参照ください