Udostępnij za pośrednictwem


Podpisy (F#)

Plik podpisu zawiera informacje o publicznym podpisów zestawu F# program elementów, takich jak typów, nazw i moduły.Może służyć do określenia dostępności tych elementów programu.

Uwagi

Dla każdego F# kod pliku, może mieć podpisu pliku, który jest plikiem, który ma taką samą nazwę pliku kodu, ale z .fsi rozszerzenie zamiast .fs.Można również dodawać pliki podpisu, do kompilacji wiersza polecenia, jeśli są bezpośrednio z wiersza polecenia.Aby rozróżnić kod pliki i podpis, pliki kodu są czasami określane jako wykonania pliki.W projekcie plik sygnatur powinien poprzedzać kod skojarzony plik.

Plik podpisu opisuje obszarów nazw, modułów, typów i członków w odpowiedni plik implementacji.Korzystając z informacji w pliku podpisu, aby określić, jakie części kodu w celu wykonania odpowiednich plików jest możliwy z kodu poza plikiem realizacji i jakie komponenty są wewnętrzne pliku implementacji.Obszary nazw, moduły i typów, które są zawarte w pliku podpisu musi być podzbiór obszarów nazw, moduły i typów, które są zawarte w pliku implementacji.Z pewnymi wyjątkami zauważyć w dalszej części tego tematu tych elementów języka, które nie są wymienione w pliku podpisu są traktowane jako prywatny do pliku implementacji.Jeśli plik podpisu nie zostanie znaleziony w projekcie lub w wierszu polecenia, dostępność domyślny jest używany.

Aby uzyskać więcej informacji o ułatwieniach dostępu domyślnej, zobacz Kontrola dostępu (F#).

W pliku podpisu nie powtarzaj definicji typów i implementacji każdej metody lub funkcji.Zamiast tego użyć podpisu dla każdej metody i funkcji, która działa jako pełną specyfikację funkcji, które jest realizowana przez fragment moduł lub obszaru nazw.Składnia podpis typu jest taki sam jak w deklaracjach metoda abstrakcyjna w interfejsach i klasy abstrakcyjne i wyświetlane są również przez technologię IntelliSense i F# interpreter fsi.exe gdy są wyświetlane prawidłowo skompilowany dane wejściowe.

Jeśli nie jest wystarczająco dużo informacji w podpisie typ, aby wskazać, czy typ jest zapieczętowany, lub czy jest to typ interfejsu, należy dodać atrybut oznacza charakter tego typu do kompilatora.Atrybuty, które używają do tego celu są opisane w poniższej tabeli.

Atrybut

Opis

[<Sealed>]

Dla typu, który nie ma żadnych członków abstrakcyjna lub które nie powinny zostać rozszerzone.

[<Interface>]

Dla typu, który jest interfejsem.

Kompilator produkuje błąd, jeśli atrybuty nie są zgodne między podpisu i deklaracji w pliku implementacji.

Użyć słowa kluczowego val do utworzenia podpisu dla wartości lub wartości funkcji.Słowo kluczowe type wprowadza podpis typu.

Można wygenerować plik podpisu przy użyciu --sig opcję kompilatora.Ogólnie można nie zapisywać .fsi pliki ręcznie.Zamiast generowania plików .fsi za pomocą kompilatora, dodaj je do swojego projektu, jeśli posiadasz i edytować je usuwając metod i funkcje, które nie mają być dostępne.

Istnieje kilka reguł typu podpisów:

  • Skróty typu w pliku implementacji nie musi odpowiadać typu bez skrót w pliku podpisu.

  • Rekordów i związków dyskryminowanych narazić wszystkie albo brak ich pól i konstruktory i zlecenia w podpisie musi odpowiadać kolejności w pliku implementacji.Klasy można odkryć niektóre lub wszystkie żaden z ich pól i metod w podpisie.

  • Klasy i struktur, które mają konstruktory musi ujawniać deklaracje ich podstawowych klas ( inherits zgłoszenia).Również klas i struktur, które mają konstruktory musi ujawniać wszystkie ich metody abstrakcyjne i deklaracje interfejsu.

  • Typy interfejsów musi ujawnić, wszystkie metody i interfejsy.

Zasady dotyczące podpisów wartości są następujące:

  • Modyfikatorów ułatwień dostępu (public, internal, i tak dalej) oraz inline i mutable modyfikatorów w podpisie muszą odpowiadać ustawieniom w realizacji.

  • Liczba parametrów typu rodzajowego (albo wywnioskowane niejawnie lub jawnie deklarowane) musi być zgodny i typy i ograniczenia typu typ rodzajowy parametrów muszą być zgodne.

  • Jeśli Literal atrybut jest używany, musi znajdować się w zarówno podpis, jak i wprowadzenia w życie i taką samą wartość literału musi używany dla obu.

  • Deseń parametry (znany również jako liczby argumentów skonkretyzowanego) podpisów i implementacji muszą być zgodne.

Poniższy przykład kodu pokazuje przykład pliku podpis, który ma obszar nazw, moduł, wartość funkcji i podpisy typu wraz z odpowiednie atrybuty.Pokazuje także odpowiedni plik implementacji.

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

Poniższy kod ilustruje plik implementacji.

namespace Library1

module Module1 =

    let function1 x = x + 1


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


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

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

Zobacz też

Koncepcje

Kontrola dostępu (F#)

Inne zasoby

Materiały referencyjne dotyczące języka F#

Opcje kompilatora (F#)