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