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