F#类型的私有修饰符

时间:2013-03-04 14:09:24

标签: f#

如果我们有

module M

type private A = B | C

(...)

私有修饰符意味着A只能在模块M中使用。但在这种情况下:

namespace N

type private A = B | C

(...)

该私有修饰符会产生什么影响? CLR命名空间拥有私有成员是没有意义的,因为命名空间可以随意扩展,那么私有修饰符会有任何影响吗?

1 个答案:

答案 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