Share via


存取控制 (F#)

「存取控制」(Access Control) 是指宣告哪些用戶端可以使用特定程式項目,例如型別、方法和函式。

存取控制基本概念

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

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

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

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

注意事項注意事項

F# 中不使用存取規範 protected,即使您可以使用以支援 protected 存取的語言來撰寫的型別也一樣。 因此,如果覆寫受保護的方法,此方法仍然只能在類別及其子代中存取。

一般而言,規範要放在實體名稱前面,除非是使用 mutable 或 inline 規範,因為它們會出現在存取控制規範後面。

如果未使用存取規範,預設即為 public,但是型別中的 let 繫結例外,這些繫結對型別來說永遠是 private。

F# 中的簽章可提供另一項機制來控制 F# 程式項目的存取狀況。 簽章不是存取控制的必要項。 如需詳細資訊,請參閱簽章 (F#)

存取控制規則

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

  • 繼承宣告 (也就是使用 inherit 指定類別的基底類別)、介面宣告 (也就是指定類別會實作介面),以及抽象成員永遠都有和封入型別相同的存取範圍。 因此,存取控制規範無法用於這些建構。

  • 已區分之聯集中的個別案例無法將自己的存取控制修飾詞與聯集型別分隔。

  • 記錄類型的個別欄位無法將自己的存取控制修飾詞與記錄型別分隔。

範例

在下列程式碼中,將示範存取控制規範的用法。 專案中有兩個檔案:Module1.fs 和 Module2.fs。 每個檔案都是隱含的模組, 因此有 Module1 和 Module2 兩個模組。 私用型別和內部型別是在 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

請參閱

其他資源

F# 語言參考

簽章 (F#)