对象表达式
对象表达式可用于创建编译器生成的匿名对象类型的新实例,该对象类型基于现有基类型、接口或接口集。
语法
// 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() = () }
使用对象表达式
如果想要避免创建新的命名类型所需的额外代码和开销,需要使用 F# 对象表达式。 如果使用对象表达式来最大程度地减少在程序中创建的类型数目,则可减少代码的行数,并防止不必要的类型激增。 可使用能够自定义现有类型或为具有的特定事例提供适当接口实现的对象表达式,而不是仅仅为了处理特定情况而创建许多类型。