2010-12-15 13 views
16

私はC#の内部アクセス修飾子を理解しようとしています。私はアセンブリが正確であること、そしてそのアセンブリの中で私のプログラムのどの部分が保持されているのか分からないようです。私は、変数は次の名前空間内のオブジェクトのみでアクセス可能であるように、それを作るしようとしていた。C#アセンブリ、アセンブリ内には何がありますか?

namespace Engine.Entity 

問題の変数は、その名前空間の内部クラスで定義されているので、私はそれが内部作られた場合、私が想定され、その名前空間内のオブジェクトだけがその名前空間にアクセスできます。私はアセンブリと名前空間を1つに見ていますが、それは正しいとは思いません。

+2

".Net Reflector"プログラムをご覧ください。それは、あなたがアセンブリを開き、その中に何が入っているかを見ることができます。 1つのアセンブリに複数の名前空間を含めることができます。 – David

答えて

19

名前空間は名前解決のみに影響します。ネームスペースはストレージの種類を暗示するものではなく、ネームスペースによってどのDLLに自分のコードが含まれているかが決まりません。ネームスペースを使用すると、物理的に別のDLLに存在していても、関連するものを論理名でグループ化できます。

アセンブリは、基本的にDLLまたはEXEファイルです。それには、そのDLLまたはEXE内のコードを記述するILコードと型情報が含まれています。これには他にもたくさんのものが入っていますが、初心者にとってはDLLと考えるだけです。

DLLまたはEXEを生成するプロジェクト(csproj)にコードをコンパイルして、コードを特定のアセンブリに配置します。

名前空間は複数のアセンブリにまたがることができます。つまり、その論理名前空間のメンバーであるクラスは、複数のDLLに存在する可能性があります。プロジェクトがそのクラスを含む正しいアセンブリ(DLL)を参照している場合にのみ、ソースコード内の特定のクラスにアクセスできます。

内部修飾子は、シンボルが同じアセンブリ内からのみアクセスできることを意味します。コードと同じDLLにコンパイルされたコードだけが、内部でタグ付けされたプロパティまたはメソッドにアクセスできます。

+0

"アセンブリは基本的にDLLまたはEXEです。"確かですが、時にはそれは任意の種類のファイル(jpeg、テキストファイルなど)または複数のファイルで同時にできます。しかし、それは端の場合です(この記事の私の答えを見てください)。 –

+0

はい、アセンブリは/物事の全体の混乱を含むことができます/含まれています。この質問のレベルには関係ありません。 – dthorpe

1

internal (C# Reference)

から、内部のキーワードをタイプし、型メンバのアクセス修飾子 です。 内蔵型またはメンバーは、だから、これは同じアセンブリ/ DLL、ないnamespace内から意味だけ 同じアセンブリ内のファイル

内でアクセス です。

0

基本的に、変数を特定の名前空間内からのみ表示することはできません。誰もが任意の名前空間を定義することができますように、これはinternalボイドのアイデアになるだろう:あなただけ

namespace System 
{ 
    public static MySystemInternalSpy 
    { 
     public static void SpyInternals() 
     { 
      ... 
     } 
    } 
} 

は、例えば、System名前空間にinternalとして定義された変数、クラスやメソッドへのアクセスを得るために記述する必要があります。

0

名前空間とアセンブリは同義ではありません。多くの場合、名前空間は複数のアセンブリにまたがっています。 Visual Studioから構築されたマネージコードには、DLL/EXEバイナリへのアセンブリのプロジェクトに1つの対応があります。

ただし、マネージコードをコマンドラインにリンクすると、複数のプロジェクトファイルがすべて1つのアセンブリに属しているアセンブリを作成できます。つまり、ディスク上の複数のファイルが1つのアセンブリを表します。しかし、決してこの事を気にしないでください。実際には決して起こらない難解なことです。

「内部」アクセス修飾子は、ターゲットがそのアセンブリ内からのみアクセスできることを意味します。名前空間には関係ありません。

5

人は、コードが物理的にどこに配置されているか(アセンブリ)、それをどのように参照するかという概念を切り離すので、名前空間/アセンブリのことで簡単に混同されます(論理参照は名前空間と参照を使用して参照されます)。アセンブリ)。

は、私は通常の単語contributeを使用してこれを説明する:

  1. アセンブリは、複数の名前空間に貢献することができます。
    例えば、System.Data(例えば、クラスSystem.Data.DataTable)およびMicrosoft.SqlServer.Server(例えば、クラスMicrosoft.SqlServer.Server.SqlContext)のような名前空間には、System.Data.dllアセンブリが寄与する。

  2. 複数のアセンブリが1つのネームスペースに寄与することができます。
    たとえば、System.Data.dllアセンブリとSystem.Xml.dllアセンブリの両方がSystem.Xml名前空間に寄与します。
    つまり、プロジェクトのSystem.Xml.XmlDataDocumentクラスを使用する場合は、System.Data.dllアセンブリを参照する必要があります。
    System.Xml.XmlDocumentクラスを使用する場合は、プロジェクトからSystem.Xml.dllを参照する必要があります。

(上記の例は.NET 4.0ですが、以前の.NETバージョンでも同様です)。

Danny Thorpeexplainednamespaceinternalというコンセプトは本当にうまくいきますので、詳細については説明しません。

--jeroen

+1

+1:私のようなC#の初心者のための非常に明確な説明 – Guillaume07