8

如果我们有

module M

type private A = B | C

(...)

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

namespace N

type private A = B | C

(...)

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

4

1 回答 1

8

如果您private在命名空间中使用类似的修饰符,它将使类型或模块对文件私有——也就是说,该类型可以被同一文件中它下面的任何东西使用。

编译该类型时,F# 编译器会将其视为internal在 .NET 元数据中。(这是有道理的,因为类型是真的internal——编译器只是强制执行它只能由同一文件中的类型/函数使用的约束。)

顺便说一句,我经常使用此功能——它对于仅在少数地方内部使用的小型辅助类型非常有用,因为它可以防止它们弄乱 IntelliSense。

编辑:您可以使用它的另一个很酷的技巧是创建文件范围的“内置”辅助函数。

如果您创建这样的模块,其中的函数将自动对其下方的任何内容可用(感谢[<AutoOpen>]),但由于模块被标记private,这些函数不会阻塞您的 IntelliSense(在处理其他源文件时)或隐藏现有功能。

[<AutoOpen>]
module private Helpers =
    let [<Literal>] blah = "blah"

    let lessThanTwo value =
        value < 2.0
于 2013-03-04T14:14:54.450 回答