2013-03-04 18 views
6

我々はprivate修飾子

module M 

type private A = B | C 

(...) 

private修飾子はAのみモジュールM.内から利用可能になることが、この場合には意味がある場合:

namespace N 

type private A = B | C 

(...) 

がどうなりますかその民間の修飾子の効果?ネームスペースを自由に拡張できるので、CLRネームスペースにプライベートメンバーを持たせるのは理にかなっていないので、プライベートモディファイアには何の効果もありませんか?

答えて

6

修飾子をネームスペース内のように使用すると、そのタイプまたはモジュールがファイルに対してプライベートになります。つまり、同じファイル内でそのタイプの下位に使用できます。

型がコンパイルされると、F#コンパイラは.NETメタデータ内でinternalとして扱います。コンパイラは、同じファイル内の型/関数でのみ使用できるという制約を適用します。

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

EDIT:ファイルスコープの「組み込み」ヘルパー関数を作成することもできます。

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

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

    let lessThanTwo value = 
     value < 2.0 
+1

これらのトリック(プライベートタイプまたはプライベートモジュール)のどちらも私にとっては役に立ちません。私はF#3.1と.NET 4.5.1を使用しています。私のプライベートタイプは別のファイルから使用できます。ヘルパーモジュールを2つの異なるファイルに貼り付けると、同じ名前の2つのモジュールがあるというコンパイルエラーが発生します。 – bananasareyellow

+1

https://github.com/Microsoft/visualfsharp/issues/43#issuecomment-70650925 – bananasareyellow