8

私たちが持っている場合

module M

type private A = B | C

(...)

private 修飾子は、モジュール M 内からのみ A を使用できることを意味します。しかし、この場合:

namespace N

type private A = B | C

(...)

そのプライベート修飾子の効果はどうなりますか? 名前空間は自由に拡張できるため、CLR 名前空間がプライベート メンバーを持つことは意味がありません。そのプライベート修飾子はまったく効果がありますか?

4

1 に答える 1

8

名前空間内でそのような修飾子を使用するprivateと、型またはモジュールがファイルに対してプライベートになります。つまり、型は同じファイル内のその下のすべてで使用できます。

型がコンパイルされると、F# コンパイラはそれをinternal.NET メタデータ内として扱います。(これは理にかなっています。型は実際にはinternal- コンパイラは、同じファイル内の型/関数でのみ使用できるという制約を適用するだけです。)

私はこの機能をかなり頻繁に使用します。IntelliSense が乱雑になるのを防ぐため、内部でいくつかの場所でのみ使用される小さなヘルパー タイプに適しています。

EDIT:これを使用できるもう1つのクールなトリックは、ファイルスコープの「組み込み」ヘルパー関数を作成することです。

このようなモジュールを作成すると、その中の関数はその下にあるものから自動的に利用可能になります ( のおかげで[<AutoOpen>]) が、モジュールがマークされprivateているため、関数が IntelliSense を詰まらせたり (他のソース ファイルで作業している場合)、隠れたりすることはありません。既存の機能。

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

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