访问控制 是指声明哪些客户端可以使用某些程序元素,例如类型、方法和函数。
访问控制基础知识
在 F# 中,访问控制说明符public
internal
private
,可以应用于模块、类型、方法、值定义、函数、属性和显式字段。
public
指示所有调用方都可以访问该实体。internal
指示只能从同一 程序集访问实体。private
指示只能从封闭类型或模块访问实体。
注释
在 F# 中不使用访问说明符,但如果你使用的是以支持protected
访问的语言编写的类型,则可以接受该说明符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