如果我们有
module M
type private A = B | C
(...)
private 修饰符意味着 A 只能在模块 M 中使用。但在这种情况下:
namespace N
type private A = B | C
(...)
该私有修饰符会产生什么影响?CLR 命名空间拥有私有成员是没有意义的,因为命名空间可以随意扩展,那么私有修饰符会产生任何影响吗?
如果我们有
module M
type private A = B | C
(...)
private 修饰符意味着 A 只能在模块 M 中使用。但在这种情况下:
namespace N
type private A = B | C
(...)
该私有修饰符会产生什么影响?CLR 命名空间拥有私有成员是没有意义的,因为命名空间可以随意扩展,那么私有修饰符会产生任何影响吗?
如果您private
在命名空间中使用类似的修饰符,它将使类型或模块对文件私有——也就是说,该类型可以被同一文件中它下面的任何东西使用。
编译该类型时,F# 编译器会将其视为internal
在 .NET 元数据中。(这是有道理的,因为类型是真的internal
——编译器只是强制执行它只能由同一文件中的类型/函数使用的约束。)
顺便说一句,我经常使用此功能——它对于仅在少数地方内部使用的小型辅助类型非常有用,因为它可以防止它们弄乱 IntelliSense。
编辑:您可以使用它的另一个很酷的技巧是创建文件范围的“内置”辅助函数。
如果您创建这样的模块,其中的函数将自动对其下方的任何内容可用(感谢[<AutoOpen>]
),但由于模块被标记private
,这些函数不会阻塞您的 IntelliSense(在处理其他源文件时)或隐藏现有功能。
[<AutoOpen>]
module private Helpers =
let [<Literal>] blah = "blah"
let lessThanTwo value =
value < 2.0