31

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

namespace Engine.Entity

問題の変数はその名前空間内のクラスで定義されているため、内部にすると、その名前空間内のオブジェクトのみがアクセスできると想定しました。私はアセンブリと名前空間を 1 つのものと見なしていますが、それは正しくないと思います。

4

5 に答える 5

32

名前空間は、名前解決のみに影響します。名前空間は、いかなる種類のストレージも意味しません。また、名前空間は、どの DLL にコードが含まれているかを決定するものでもありません。名前空間を使用すると、物理的に異なる DLL に存在する場合でも、関連するものを論理名でグループ化できます。

アセンブリは、基本的に単なる DLL または EXE ファイルです。これには、IL コードと、その DLL または EXE のコードを説明する型情報が含まれています。他にも多くのものを含めることができますが、最初は DLL と考えてください。

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

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

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

于 2010-12-15T05:49:11.367 に答える
9

コードが物理的に配置されている場所 (アセンブリ) とそれを参照する方法 (論理参照は名前空間を使用し、物理参照はアセンブリを参照することによる) の概念を分離するため、人々は名前空間/アセンブリのことで簡単に混乱します。

私は通常、次の言葉を使用してこれを説明しますcontribute

  1. アセンブリは、複数の名前空間に貢献できます
    たとえば、アセンブリは(たとえば class ) や(たとえばclass ) などのSystem.Data.dll名前空間に貢献します。System.DataSystem.Data.DataTableMicrosoft.SqlServer.ServerMicrosoft.SqlServer.Server.SqlContext

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

(上記の例は .NET 4.0 ですが、以前の .NET バージョンにも当てはまる可能性があります)。

Danny Thorpe はandの概念を非常によく説明しているので、それらについては詳しく説明しません。namespaceinternal

--jeroen

于 2010-12-15T09:24:56.820 に答える
2

内部から(C# リファレンス)

internal キーワードは、型および型メンバーのアクセス修飾子です。内部型または内部メンバーは、同じアセンブリ内のファイル内でのみアクセスできます

したがって、これはnamespaceではなく、同じアセンブリ/dll 内からということです。

于 2010-12-15T05:42:54.503 に答える
0

基本的に、特定のネームスペース内からのみ変数を可視にすることはできません。誰でも任意の名前空間を定義できるため、これはinternalvoid の考え方になります。

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

internalたとえば、System名前空間で定義されている変数、クラス、またはメソッドにアクセスできます。

于 2010-12-15T05:52:04.030 に答える
0

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

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

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

于 2010-12-15T05:52:59.590 に答える