Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Файл подписи содержит сведения о общедоступных подписях набора элементов программы F#, таких как типы, пространства имен и модули. Его можно использовать для указания специальных возможностей этих элементов программы.
Замечания
Для каждого файла кода F# можно иметь файл сигнатуры, который имеет то же имя, что и файл кода, но с расширением .fsi вместо FS. Файлы подписи также можно добавить в командную строку компиляции, если вы используете командную строку напрямую. Чтобы различать файлы кода и файлы подписи, файлы кода иногда называются файлами реализации. В проекте файл подписи должен предшествовать связанному файлу кода.
Файл подписи описывает пространства имен, модули, типы и элементы в соответствующем файле реализации. Сведения в файле подписи позволяют указать, какие части кода в соответствующем файле реализации можно получить из кода за пределами файла реализации, а также какие части являются внутренними для файла реализации. Пространства имен, модули и типы, включенные в файл подписи, должны быть подмножеством пространств имен, модулей и типов, включенных в файл реализации. При некоторых исключениях, указанных далее в этом разделе, эти языковые элементы, не перечисленные в файле подписи, считаются закрытыми для файла реализации. Если файл подписи не найден в проекте или командной строке, используется специальные возможности по умолчанию.
Дополнительные сведения о специальных возможностях по умолчанию см. в разделе "Управление доступом".
В файле подписи не повторяйте определение типов и реализаций каждого метода или функции. Вместо этого вы используете сигнатуру для каждого метода и функции, которая выступает в качестве полной спецификации функциональных возможностей, реализованных фрагментом модуля или пространства имен. Синтаксис сигнатуры типа совпадает с тем, что используется в объявлениях абстрактных методов в интерфейсах и абстрактных классах, а также отображается IntelliSense и интерпретатором F#, fsi.exe при правильном компиляции входных данных.
Если в сигнатуре типа недостаточно сведений, чтобы указать, запечатывается ли тип или тип интерфейса, необходимо добавить атрибут, указывающий характер типа компилятору. Атрибуты, используемые для этой цели, описаны в следующей таблице.
| Свойство | Описание |
|---|---|
[<Sealed>] |
Для типа без абстрактных элементов или не должно быть расширено. |
[<Interface>] |
Для типа, который является интерфейсом. |
Компилятор создает ошибку, если атрибуты не согласованы между сигнатурой и объявлением в файле реализации.
Используйте ключевое слово val для создания подписи для значения или значения функции. Ключевое слово type представляет сигнатуру типа.
Файл подписи можно создать с помощью параметра компилятора --sig . Как правило, файлы FSI не записываются вручную. Вместо этого вы создаете FSI-файлы с помощью компилятора, добавляете их в проект, если у вас есть, и редактируете их, удаляя методы и функции, которые не хотят быть доступными.
Существует несколько правил для подписей типов:
Аббревиатуры типов в файле реализации не должны соответствовать типу без аббревиатуры в файле подписи.
Записи и дискриминированные профсоюзы должны предоставлять либо все или ни один из своих полей и конструкторов, а порядок в сигнатуре должен соответствовать порядку в файле реализации. Классы могут выявить некоторые, все или ни один из полей и методов в сигнатуре.
Классы и структуры, имеющие конструкторы, должны предоставлять объявления своих базовых классов (
inheritsобъявление). Кроме того, классы и структуры, имеющие конструкторы, должны предоставлять все их абстрактные методы и объявления интерфейса.Типы интерфейсов должны раскрывать все их методы и интерфейсы.
Ниже приведены правила подписей значений.
Модификаторы для специальных возможностей (
public,internalи т. д.) иinlinemutableмодификаторы в сигнатуре должны соответствовать модификаторам в реализации.Число параметров универсального типа (неявно выводимых или явно объявленных) должно соответствовать, а ограничения типов и типов в параметрах универсального типа должны соответствовать.
LiteralЕсли используется атрибут, он должен отображаться как в сигнатуре, так и в реализации, а для обоих необходимо использовать одно и то же литеральное значение.Шаблон параметров (также известный как arity) подписей и реализаций должен быть согласованным.
Если имена параметров в файле подписи отличаются от соответствующего файла реализации, вместо этого будет использоваться имя в файле подписи, что может привести к проблемам при отладке или профилировании. Если вы хотите получать уведомления о таких несоответствиях, включите предупреждение 3218 в файле проекта или при вызове компилятора (см. раздел
--warnon"Параметры компилятора").
В следующем примере кода показан пример файла сигнатуры с пространством имен, модулем, значением функции и сигнатурами типов вместе с соответствующими атрибутами. В нем также показан соответствующий файл реализации.
// 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
В следующем коде показан файл реализации.
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
См. также
- Справочник по языку F#
- Контроль доступа
- Параметры компилятора