訪問控制 是指宣告哪些用戶端可以使用特定程序專案,例如類型、方法和函式。
訪問控制的基本概念
在 F# 中,訪問控制規範 public、 internal和 private 可以套用至模組、類型、方法、值定義、函式、屬性和明確欄位。
public表示所有呼叫端都可以存取實體。internal表示只能從相同的 元件存取實體。private表示只能從封入類型或模組存取實體。
備註
存取規範不會在 F# 中使用,但如果您使用以支援存取的語言protected撰寫的類型,則可接受的存取規範protected。 因此,如果您覆寫受保護的方法,則方法只會在 類別及其子代記憶體取。
存取規範會放在實體名稱前面。
如果未使用存取規範,則預設值為 public,但 let 類型中的系結除外,這些系結一律 private 會指向類型。
F# 中的簽章提供另一個機制來控制 F# 程式元素的存取。 訪問控制不需要簽章。 如需詳細資訊,請參閱 簽章。
訪問控制的規則
存取控制受限於下列規則:
繼承宣告(亦即,使用
inherit來指定類別的基類)、介面宣告(也就是指定類別實作介面),而抽象成員一律具有與封入型別相同的輔助功能。 因此,訪問控制規範無法在這些建構上使用。歧視聯集中個別案例的輔助功能取決於歧視聯集本身的存取範圍。 也就是說,特定等位案例不亞於聯集本身。
記錄類型的個別欄位存取範圍取決於記錄本身的存取範圍。 也就是說,特定記錄標籤不亞於記錄本身的可存取性。
範例
下列程式代碼說明訪問控制規範的使用。 專案中有兩個檔案, Module1.fs 與 Module2.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