物件運算式 (F#)
「物件運算式」(Object Expression) 會根據現有的基底型別、一個介面或一組介面來建立動態建立、匿名物件型別的新執行個體。
// 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 描述選擇性泛型型別參數。 arguments 只適用於類別型別,它需要建構函式參數。 member-definitions 是基底類別方法的覆寫,或是來自基底類別或介面之抽象方法的實作。
下列範例說明物件運算式的數個不同型別。
// This object expression specifies a System.Object but overrides the
// ToString method.
let obj1 = { new System.Object() with member x.ToString() = "F#" }
printfn "%A" obj1
// This object expression implements the IFormattable interface.
let Delimiter(delim1 : string, delim2 : string ) = { new System.IFormattable with
member x.ToString(format : string, provider : System.IFormatProvider) =
if format = "D" then delim1 + x.ToString() + delim2
else x.ToString()
}
let obj2 = Delimiter("{","}");
printfn "%A" (System.String.Format("{0:D}", obj2))
// This object expression implements multiple 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 an interface chain.
let Implementer() = { new ISecond with
member this.H() = ()
member this.J() = ()
interface IFirst with
member this.F() = ()
member this.G() = ()
}
使用物件運算式
當您要避免建立新的具名型別所需的額外程式碼和額外負荷時,可以使用物件運算式。 如果您要使用物件運算式將程式中建立的型別數目降至最低,可以減少程式碼行數以及避免過多不需要的型別。 與其只為了處理特定狀況而建立許多型別,您可以針對手邊特定的案例,使用物件運算式來自訂現有型別或提供適當的介面實作。