分享方式:


存取控制

「存取控制」是指宣告哪些用戶端可以使用特定程式元素,例如類型、方法和函式。

存取控制的基本概念

在 F# 中,存取控制規範 publicinternalprivate 可以套用至模組、類型、方法、值定義、函式、屬性和明確欄位。

  • public 表示所有呼叫者都可以存取實體。

  • internal 表示只能從相同的組件存取實體。

  • private 表示只能從封入類型或模組存取實體。

注意

雖然您可以使用支援 protected 存取之語言撰寫的類型,但 F# 中不會使用存取規範 protected。 因此,如果您覆寫受保護的方法,則您的方法只能在類別及其子代內存取。

存取指定名稱會在實體名稱之前。

如果未使用任何存取規範,則預設值為 public,但類型中的 let 繫結除外,其對於類型一律為 private

F# 中的特徵標記提供另一種機制來控制對 F# 程式元素的存取。 存取控制不需要特徵標記。 如需詳細資訊,請參閱簽章

存取控制的規則

存取控制受制於下列規則:

  • 繼承宣告 (也就是說,使用 inherit 來指定類別的基底類別)、介面宣告 (也就是指定類別實作介面),而抽象成員一律具有與封入類型相同的存取性。 因此,存取控制規範不能用於這些建構。

  • 差異聯集中個別案例的存取性,取決於差異聯集本身的存取性。 也就是說,特定聯集案例的存取性,不小於聯集本身的存取性。

  • 記錄類型個別欄位的存取性,取決於記錄本身的存取性。 也就是說,特定記錄標籤的存取性,不小於記錄本身的存取性。

範例

下列程式碼說明存取控制規範的使用方式。 專案中有兩個檔案,Module1.fsModule2.fs。 每個檔案都是隱含的模組。 因此有兩個模組,Module1Module2。 私用類型和內部類型都是在 Module1 內定義。 您無法從 Module2 存取私用類型,但可以在其中存取內部類型。

// Module1.fs

module Module1

// This type is not usable outside of this file
type private MyPrivateType() =
   // x is private since this is an internal let binding
   let x = 5
   // X is private and does not appear in the QuickInfo window
   // when viewing this type in the Visual Studio editor
   member private this.X() = 10
   member this.Z() = x * 100

type internal MyInternalType() =
   let x = 5
   member private this.X() = 10
   member this.Z() = x * 100

// Top-level let bindings are public by default,
// so "private" and "internal" are needed here since a
// value cannot be more accessible than its type.
let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()

// let bindings at the top level are public by default,
// so result1 and result2 are public.
let result1 = myPrivateObj.Z
let result2 = myInternalObj.Z

下列程式碼會測試在 Module1.fs 內建立之類型的存取性。

// Module2.fs
module Module2

open Module1

// The following line is an error because private means
// that it cannot be accessed from another file or module
// let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()

let result = myInternalObj.Z

另請參閱