Sdílet prostřednictvím


Typ rozšíření (F#)

Typ rozšíření umožňují přidat nové členy typu dříve definovaného objektu.

// Intrinsic extension.
type typename with
   member self-identifier.member-name =
      body
   ...
   [ end ]

// Optional extension.
type typename with
   member self-identifier.member-name =
      body
   ...
   [ end ]

Poznámky

Existují dvě formy typ rozšíření, které mají mírně odlišné syntaxe a chování.Vnitřní rozšíření je jako typ rozšiřuje příponu, která se zobrazí ve stejném oboru názvů nebo modulu, stejný zdrojový soubor a stejné sestavení (DLL nebo spustitelný soubor).Volitelné rozšíření je rozšíření vně původní modul, obor názvů nebo sestavení typu prodloužena.Typ je přezkoumán odraz, ale nemají volitelné rozšíření na typu zobrazit vnitřní rozšíření.Volitelné rozšíření musí být v modulech a jsou pouze v rozsahu, v otevřeném modulu, který obsahuje příponu.

V syntaxi předchozí typename představuje typ, který se rozšiřuje.Lze rozšířit libovolného typu, která je přístupná, ale název typu musí být skutečný typ názvu, není zadejte zkratku.V jednom typu rozšíření lze definovat více členů.self-identifier Představuje instanci objektu vyvolávané stejně jako v běžném členů.

end Je volitelné lehký syntaxi klíčového slova.

Členy definované v typ rozšíření lze stejně jako ostatní členy typu třídy.Stejně jako ostatní členové mohou být statické nebo instance členy.Tyto metody jsou známé také jako rozšíření metody; vlastnosti jsou známé jako Vlastnosti rozšíření, atd.Volitelné rozšíření členy jsou kompilovány do statické členy, jejichž instance objektu je předán implicitně jako první parametr.Však jednat, jako kdyby byly členy instance nebo statické členy podle jak jsou deklarovány.Implicitní rozšíření členové jsou zahrnuty jako členové typu a mohou být použity bez omezení.

Rozšíření metody nemohou být virtuální nebo abstraktní metody.Jejich přetěžovat, jiné metody se stejným názvem, ale kompilátor dává přednost-extension metod pro dvojznačné volání.

Pokud jeden typ více přípon vnitřních typů, všechny členy musí být jedinečný.Pro typ volitelné rozšíření v jiný typ rozšíření stejného typu mohou členové stejné názvy.Nejasnost chybám dochází pouze v případě, že kód klienta otevře dvou různých oborů, které definují stejné názvy členů.

V následujícím příkladu má typ v modulu rozšíření vnitřního typu.Kód klienta mimo modul typ rozšíření objeví jako členem typu ve všech ohledech normální.

module MyModule1 =

    // Define a type.
    type MyClass() =
      member this.F() = 100

    // Define type extension.
    type MyClass with
       member this.G() = 200

module MyModule2 =
   let function1 (obj1: MyModule1.MyClass) =
      // Call an ordinary method.
      printfn "%d" (obj1.F())
      // Call the extension method.
      printfn "%d" (obj1.G())

Rozšíření vnitřního typu lze oddělit definice typu do oddílů.To může být užitečné při správě velkého typu definice, například oddělit vytvořené a kód generovaný kompilátorem nebo seskupit kód vytvořené různými osobami nebo spojené s různými funkcemi.

V následujícím příkladu je typ volitelné rozšíření rozšiřuje System.Int32 typu s metodu rozšíření FromString , který volá statický člen Parse.testFromString Metoda ukazuje, že nový člen se nazývá stejně jako kterýkoli člen instance.

// Define a new member method FromString on the type Int32.
type System.Int32 with
    member this.FromString( s : string ) =
       System.Int32.Parse(s)

let testFromString str =  
    let mutable i = 0
    // Use the extension method.
    i <- i.FromString(str)
    printfn "%d" i

testFromString "500"

Nový člen instance vypadat jako jakékoliv jiné metody Int32 typ technologie IntelliSense, ale pouze v případě, že modul, který obsahuje rozšíření je otevřen nebo jinak v oboru.

Viz také

Další zdroje

F# Language Reference

Členy (F#)