访问控制

访问控制 是指声明哪些客户端可以使用某些程序元素,例如类型、方法和函数。

访问控制基础知识

在 F# 中,访问控制说明符publicinternalprivate,可以应用于模块、类型、方法、值定义、函数、属性和显式字段。

  • 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

另请参阅