f# - F# 类型的私有(private)修饰符

标签 f#

如果我们有

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/

相关文章:

compiler-construction - F#中的属性语法系统

.net - AWS Lambda 上带有 netcoreapp2.0 的 Npgsql 无法连接(有超时) - 我该如何解决?

f# - 如何获取接口(interface)实例方法的 F# 引用?

F# 值阴影 - 是否可以在同一范围内禁用值阴影

f# - 假的 : Target prints all available targets in build script

list - F# - 如何将列表转换为列表列表?

.net - FParsec 中的尾递归

f# - F#编译器中的字符串串联优化

reflection - 在运行时创建匿名记录类型

silverlight - 如何在 Silverlight( F#) 中创建异步 HttpWebRequest