共用方式為


簽名

簽章檔案包含一組 F# 程式專案之公用簽章的相關信息,例如類型、命名空間和模組。 它可以用來指定這些程式項目的輔助功能。

備註

對於每個 F# 程式代碼檔案,您可以有一個 簽章檔案,該檔案的名稱與程式代碼檔案相同,但擴展名為 .fsi,而不是 .fs。 如果您直接使用命令行,簽章檔案也可以新增至編譯命令行。 為了區分程式代碼檔案和簽章檔案,程式代碼檔案有時稱為 實作檔案。 在專案中,簽章檔案應該位於相關聯的程式代碼檔案之前。

簽章檔案描述對應實作檔中的命名空間、模組、類型和成員。 您可以使用簽章檔案中的資訊來指定對應實作檔案中程序代碼的哪些部分可以從實作檔案外部的程式代碼存取,以及實作檔案內部有哪些部分。 簽章檔案中包含的命名空間、模組和類型必須是實作檔案中包含的命名空間、模組和類型子集。 本主題稍後會指出某些例外狀況,簽章檔案中未列出的語言專案會被視為實作檔案的私人專案。 如果在專案或命令行中找不到簽章檔案,則會使用預設輔助功能。

如需默認輔助功能的詳細資訊,請參閱 訪問控制

在簽章檔案中,您不會重複類型的定義和每個方法或函式的實作。 相反地,您會使用每個方法和函式的簽章,做為模組或命名空間片段所實作之功能的完整規格。 型別簽章的語法與在介面和抽象類的抽象方法宣告中使用的語法相同,而且也會由 IntelliSense 和 F# 解釋器在顯示正確編譯的輸入時 fsi.exe 顯示。

如果型別簽章中沒有足夠的資訊來指出類型是否已密封,或它是否為介面類型,您必須將指出型別本質的屬性新增至編譯程式。 下表說明您用於此用途的屬性。

屬性 說明
[<Sealed>] 對於沒有抽象成員的類型,或不應該擴充的類型。
[<Interface>] 如果是介面的類型。

如果屬性在實作檔中的簽章和宣告之間不一致,編譯程式會產生錯誤。

使用 關鍵詞 val 來建立值或函式值的簽章。 關鍵詞 type 引進類型簽章。

您可以使用編譯程式選項來產生簽章檔案 --sig 。 一般而言,您不會手動寫入 .fsi 檔案。 相反地,您可以使用編譯程序產生 .fsi 檔案、新增至您的專案、如果您有一個檔案,並藉由移除您不想存取的方法和函式加以編輯。

類型簽章有數個規則:

  • 實作檔案中的類型縮寫不得符合簽章檔案中沒有縮寫的類型。

  • 記錄和歧視聯集必須公開其字段和建構函式,且簽章中的順序必須符合實作檔案中的順序。 類別可以在簽章中顯示部分、全部或沒有任何欄位和方法。

  • 具有建構函式的類別和結構必須公開其基類的宣告( inherits 宣告)。 此外,具有建構函式的類別和結構必須公開其所有抽象方法和介面宣告。

  • 介面類型必須顯示其所有方法和介面。

值簽章的規則如下:

  • 輔助功能修飾詞(publicinternal等等)和 inline 簽章中的和 mutable 修飾詞必須符合實作中的修飾詞。

  • 泛型型別參數的數目(隱含推斷或明確宣告)必須相符,泛型類型參數中的類型和類型條件約束必須相符。

  • 如果使用 屬性 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

另請參閱