Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Файл подписи содержит сведения о общедоступных подписях набора элементов программы 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#
- Контроль доступа
- Параметры компилятора