Sdílet prostřednictvím


Podpisy

Soubor podpisu obsahuje informace o veřejných podpisech sady programových prvků jazyka F#, jako jsou typy, obory názvů a moduly. Dá se použít k určení přístupnosti těchto prvků programu.

Poznámky

Pro každý soubor kódu F# můžete mít soubor podpisu, což je soubor, který má stejný název jako soubor kódu, ale s příponou .fsi místo .fsi. Soubory podpisů lze také přidat do příkazového řádku kompilace, pokud používáte přímo příkazový řádek. K rozlišení souborů kódu a podpisových souborů se soubory kódu někdy označují jako implementační soubory. V projektu by soubor podpisu měl předcházet přidruženému souboru kódu.

Soubor podpisu popisuje obory názvů, moduly, typy a členy v odpovídajícím souboru implementace. Informace v souboru podpisu slouží k určení částí kódu v odpovídajícím souboru implementace, ke které lze přistupovat z kódu mimo implementační soubor a které části jsou interní pro implementační soubor. Obory názvů, moduly a typy, které jsou součástí souboru podpisu, musí být podmnožinou oborů názvů, modulů a typů, které jsou součástí souboru implementace. S některými výjimkami uvedenými dále v tomto tématu jsou prvky jazyka, které nejsou uvedeny v souboru podpisu, považovány za soukromé pro implementační soubor. Pokud se v projektu nebo příkazovém řádku nenajde žádný soubor podpisu, použije se výchozí přístupnost.

Další informace o výchozí přístupnosti najdete v tématu Řízení přístupu.

V souboru podpisu neopakujete definici typů a implementací každé metody nebo funkce. Místo toho použijete podpis pro každou metodu a funkci, která funguje jako úplná specifikace funkcí implementovaných modulem nebo fragmentem oboru názvů. Syntaxe podpisu typu je stejná jako v abstraktních deklarací metod v rozhraních a abstraktních třídách a je také zobrazena IntelliSense a interpretem jazyka F# fsi.exe, když zobrazuje správně zkompilovaný vstup.

Pokud v podpisu typu není dostatek informací, které indikují, zda je typ zapečetěn nebo zda se jedná o typ rozhraní, je nutné přidat atribut, který označuje povahu typu kompilátoru. Atributy, které používáte pro tento účel, jsou popsány v následující tabulce.

Atribut Popis
[<Sealed>] Pro typ, který nemá žádné abstraktní členy nebo který by neměl být rozšířen.
[<Interface>] Pro typ, který je rozhraní.

Kompilátor vytvoří chybu, pokud atributy nejsou konzistentní mezi podpisem a deklarací v souboru implementace.

Pomocí klíčového slova val vytvořte podpis pro hodnotu nebo hodnotu funkce. Klíčové slovo type představuje podpis typu.

Soubor podpisu můžete vygenerovat pomocí možnosti kompilátoru --sig . Obecně platí, že soubory .fsi nezapisujete ručně. Místo toho pomocí kompilátoru vygenerujete soubory .fsi, přidáte je do projektu, pokud ho máte, a upravíte je odebráním metod a funkcí, které nechcete mít přístup.

Pro podpisy typů existuje několik pravidel:

  • Zkratky typů v souboru implementace nesmí odpovídat typu bez zkratky v souboru podpisu.

  • Záznamy a diskriminované sjednocení musí zveřejnit buď všechna nebo žádná pole a konstruktory, a pořadí v podpisu musí odpovídat pořadí v souboru implementace. Třídy mohou odhalit některá, všechna nebo žádná pole a metody v podpisu.

  • Třídy a struktury, které mají konstruktory, musí vystavit deklarace jejich základních tříd (deklarace inherits ). Třídy a struktury, které mají konstruktory, musí také vystavit všechny jejich abstraktní metody a deklarace rozhraní.

  • Typy rozhraní musí odhalit všechny jejich metody a rozhraní.

Pravidla pro podpisy hodnot jsou následující:

  • Modifikátory pro přístupnost (publicatd internal.) a inlinemutable modifikátory v podpisu musí odpovídat modifikátorům v implementaci.

  • Počet parametrů obecného typu (implicitně odvozených nebo explicitně deklarovaných) se musí shodovat a typy a omezení typů v parametrech obecného typu se musí shodovat.

  • Literal Pokud se atribut použije, musí se objevit v podpisu i implementaci a pro oba musí být použita stejná hodnota literálu.

  • Vzor parametrů (označovaný také jako arity) podpisů a implementací musí být konzistentní.

  • Pokud se názvy parametrů v souboru podpisu liší od odpovídajícího souboru implementace, použije se místo toho název v souboru podpisu, což může způsobit problémy při ladění nebo profilaci. Pokud chcete být upozorněni na takové neshody, povolte v souboru projektu upozornění 3218 nebo při vyvolání kompilátoru (viz --warnon část Možnosti kompilátoru).

Následující příklad kódu ukazuje příklad souboru podpisu, který má obor názvů, modul, hodnotu funkce a podpisy typů společně s příslušnými atributy. Zobrazuje také odpovídající soubor implementace.

// Module1.fsi

namespace Library1
  module Module1 =
    val function1 : int -> int
    type Type1 =
        new : unit -> Type1
        member method1 : unit -> unit
        member method2 : unit -> unit

    [<Sealed>]
    type Type2 =
        new : unit -> Type2
        member method1 : unit -> unit
        member method2 : unit -> unit

    [<Interface>]
    type InterfaceType1 =
        abstract member method1 : int -> int
        abstract member method2 : string -> unit

Následující kód ukazuje soubor implementace.

namespace Library1

module Module1 =

    let function1 x = x + 1


    type Type1() =
        member type1.method1() =
            printfn "type1.method1"
        member type1.method2() =
            printfn "type1.method2"


    [<Sealed>]
    type Type2() =
        member type2.method1() =
            printfn "type2.method1"
        member type2.method2() =
            printfn "type2.method2"

    [<Interface>]
    type InterfaceType1 =
        abstract member method1 : int -> int
        abstract member method2 : string -> unit

Viz také