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