2013-08-27 1 views
33

Javaでは、パッケージ内でクラスを使用できるようにするパッケージレベルの保護があります。名前空間内のみにクラスを公開するためのC#アクセス修飾子

C#の名前空間は、多かれ少なかれパッケージと同じように動作します。しかし、C#には名前空間内のクラスを保護するための保護レベルはありません。

具体的な理由はありますか?

+0

c#にはアセンブリがあり、 'internal'キーワードを使用できます。 –

答えて

14

アクセス修飾子はありません。最も近い修飾子はinternalですが、保護の単位はクラスが存在するアセンブリであり、名前空間は存在しません。

internalを使用して同様のレベルの制御を達成することが可能であると主張することができます。両方の種類の制限により、外部からのアクセスがライブラリの実装の詳細にアクセスできなくなります。違いを生む唯一の人は、あなた、図書館の作家です。あなたは何を公開するのか、とにかく隠すべきなのかを完全にコントロールしています。基本的には、名前空間の外側でクラスを使用したくない場合は、単にクラスの使用を控えてください。クラスがinternalの場合、誰もそのクラスを使用することはできません。 .NETではassemlies(DLLまたはEXEファイル)がある

+1

これは本当です。しかし、ライブラリを構築するコードの実装の詳細をコンシューマに表示したくない場合があります。私は主に違いがある理由を自分自身が疑問視していました。 – Jaco

+2

@Jacoクラスで同じアセンブリのコードを記述している他のクラスからクラスを非表示にしたい場合、これらはあなたの同僚であるとみなされます。彼らがあなたの内部クラスを使い始めると、あなたはそれらに歩いて行くことができ、彼らが使用するために意図されていない何かを使うという危険を説明する素敵な平和な会話をすることができます:-) – dasblinkenlight

+0

逆コンパイラを得るので、彼らが必要とするすべてを見ます。真剣に、名前空間は何も規制しない。それはあなたのPCにフォルダ化するようなものです。クラスアクセス修飾子はすべてを規制します。実際には、パブリックタイプのない名前空間がある場合、アセンブリが参照されると、その名前空間も参照されません。 –

2

、あなただけの同じアセンブリ内

1

へのアクセスを制限するinternal修飾子を使用することができ、このための具体的な理由はありますか?

すでにリンク質問に、ここで言われて何簡素化するための鍵differences between packages and namespaces

いくつかありますので、ほとんどの場合、それはです:C#での名前空間は、内部と外部の両方、アセンブリの内容を整理を助けるために、ほとんどですが。 JavaパッケージにはC#アセンブリと多くの共通点があり、アセンブリレベルに制限するC#のアクセス修飾子はinternalです。

関連する問題