Dela via


Objektuttryck

Ett objektuttryck är ett uttryck som skapar en ny instans av en kompilator genererad, anonym objekttyp som baseras på en befintlig bastyp, ett gränssnitt eller en uppsättning gränssnitt.

Syntax

// 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 ]
}

Kommentarer

I den tidigare syntaxen representerar typnamnet en befintlig klasstyp eller gränssnittstyp. type-params beskriver de valfria generiska typparametrarna. Argumenten används endast för klasstyper som kräver konstruktorparametrar. Medlemsdefinitionerna är åsidosättningar av basklassmetoder eller implementeringar av abstrakta metoder från antingen en basklass eller ett gränssnitt.

I följande exempel visas flera olika typer av objektuttryck.

// 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() = () }

Använda objektuttryck

Du använder objektuttryck när du vill undvika den extra kod och de extra kostnader som krävs för att skapa en ny, namngiven typ. Om du använder objektuttryck för att minimera antalet typer som skapats i ett program kan du minska antalet kodrader och förhindra onödig spridning av typer. I stället för att skapa många typer bara för att hantera specifika situationer kan du använda ett objektuttryck som anpassar en befintlig typ eller tillhandahåller en lämplig implementering av ett gränssnitt för det specifika fallet.

Se även