存取控制
「存取控制」是指宣告哪些用戶端可以使用特定程式元素,例如類型、方法和函式。
存取控制的基本概念
在 F# 中,存取控制規範 public
、internal
和 private
可以套用至模組、類型、方法、值定義、函式、屬性和明確欄位。
public
表示所有呼叫者都可以存取實體。internal
表示只能從相同的組件存取實體。private
表示只能從封入類型或模組存取實體。
注意
雖然您可以使用支援 protected
存取之語言撰寫的類型,但 F# 中不會使用存取規範 protected
。 因此,如果您覆寫受保護的方法,則您的方法只能在類別及其子代內存取。
存取指定名稱會在實體名稱之前。
如果未使用任何存取規範,則預設值為 public
,但類型中的 let
繫結除外,其對於類型一律為 private
。
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