Objektové výrazy
Výraz objektu je výraz, který vytvoří novou instanci vygenerovaného kompilátoru, anonymní typ objektu založený na existujícím základním typu, rozhraní nebo sadě rozhraní.
Syntaxe
// 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 ]
}
Poznámky
V předchozí syntaxi představuje název typu existující třídy nebo typ rozhraní. Parametry type-params popisují volitelné parametry obecného typu. Argumenty se používají pouze pro typy tříd, které vyžadují parametry konstruktoru. Definice členů jsou přepsání metod základní třídy nebo implementace abstraktních metod ze základní třídy nebo rozhraní.
Následující příklad ukazuje několik různých typů výrazů objektu.
// 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() = () }
Použití výrazů objektů
Výrazy objektů se používají, pokud se chcete vyhnout nadbytečnému kódu a režijním nákladům potřebným k vytvoření nového pojmenovaného typu. Pokud pomocí výrazů objektů minimalizujete počet typů vytvořených v programu, můžete snížit počet řádků kódu a zabránit zbytečnému šíření typů. Místo vytváření mnoha typů jen pro zpracování konkrétních situací můžete použít objektový výraz, který přizpůsobí existující typ nebo poskytne odpovídající implementaci rozhraní pro konkrétní případ.