Бөлісу құралы:


Подписи

Файл подписи содержит сведения о общедоступных подписях набора элементов программы 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

См. также