31

我试图了解 C# 中的内部访问修饰符。我似乎无法理解程序集到底是什么,以及我的程序的哪些部分保存在该程序集中。我试图使变量只能由以下命名空间中的对象访问:

namespace Engine.Entity

有问题的变量是在该命名空间内的一个类中定义的,因此我假设如果我将其设为内部,则只有该命名空间内的对象才能访问它。我将程序集和命名空间视为一体,我认为这是不对的。

4

5 回答 5

32

命名空间仅影响名称解析。命名空间并不意味着任何类型的存储,命名空间也不决定哪些 DLL 包含您的代码。命名空间允许您将相关事物组合在一个逻辑名称下,即使它们可能物理上位于不同的 DLL 中。

程序集基本上只是一个 DLL 或 EXE 文件。它包含描述该 DLL 或 EXE 中代码的 IL 代码和类型信息。它也可以包含许多其他内容,但对于初学者来说,只需将其视为 DLL。

通过将代码编译到生成 DLL 或 EXE 的项目 (csproj) 中,您可以将代码放入特定程序集中。

一个命名空间可以跨越多个程序集。也就是说,作为该逻辑命名空间成员的类可能驻留在多个 DLL 中。只有当您的项目引用包含该类的正确程序集 (DLL) 时,您才能访问源代码中的特定类。

Internal 修饰符意味着只能从同一个程序集中访问该符号。只有编译到与您的代码相同的 DLL 中的代码才能访问带有 internal 标记的属性或方法。

于 2010-12-15T05:49:11.367 回答
9

人们很容易对命名空间/程序集感到困惑,因为它解耦了代码物理位置(程序集)和如何引用它的概念(逻辑引用是使用命名空间,物理引用是引用程序集)。

我通常用这个词来解释这个contribute

  1. 一个程序集可以为多个命名空间做出贡献
    例如,System.Data.dll程序集有助于命名空间,例如System.Data(例如 class System.Data.DataTable)和Microsoft.SqlServer.Server(例如 class Microsoft.SqlServer.Server.SqlContext)。

  2. 多个程序集可以构成一个命名空间
    例如,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 Thorpe很好地 解释namespace了and的概念internal,所以我不会详细介绍这些。

——杰伦

于 2010-12-15T09:24:56.820 回答
2

来自内部(C# 参考)

internal 关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问

所以这意味着来自同一个程序集/dll,而不是namespace

于 2010-12-15T05:42:54.503 回答
0

基本上,您不能使变量仅在给定的命名空间内可见。由于任何人都可以定义任何名称空间,因此这会使想法internal无效:您只需编写

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

例如,访问命名空间中定义的任何变量、类或internal方法System

于 2010-12-15T05:52:04.030 回答
0

命名空间和程序集不是同义词。通常一个命名空间跨越多个程序集。从 Visual Studio 构建的任何托管代码都具有一对一的项目到程序集到 DLL/EXE 二进制文件的对应关系。

但是,如果将托管代码与命令行链接,则可以创建一个程序集,其中多个项目文件都属于一个程序集(这意味着磁盘上的多个文件一起代表一个程序集)。但不管这种情况,这是一件深奥的事情,在实践中从未发生过。

“内部”访问修饰符仅意味着只能从该程序集中访问目标。它与命名空间无关。

于 2010-12-15T05:52:59.590 回答