对象表达式 (F#)
对象表达式是一个表达式,可用于创建基于现有的基类型、接口或接口集动态创建的匿名对象类型的新实例。
// 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() = ()
}
使用对象表达式
若要避免创建新的命名类型所需的额外代码和开销,可以使用对象表达式。 如果使用对象表达式来最小化程序中创建的类型数目,您可以减少代码行数,并防止出现不必要的类型增殖。 您不必仅仅为了处理特定情况而创建许多类型,您可以使用一个对象表达式来自定义现有类型或提供一个接口的适当实现,以便处理目前的特定情况。