我试图了解 C# 中的内部访问修饰符。我似乎无法理解程序集到底是什么,以及我的程序的哪些部分保存在该程序集中。我试图使变量只能由以下命名空间中的对象访问:
namespace Engine.Entity
有问题的变量是在该命名空间内的一个类中定义的,因此我假设如果我将其设为内部,则只有该命名空间内的对象才能访问它。我将程序集和命名空间视为一体,我认为这是不对的。
我试图了解 C# 中的内部访问修饰符。我似乎无法理解程序集到底是什么,以及我的程序的哪些部分保存在该程序集中。我试图使变量只能由以下命名空间中的对象访问:
namespace Engine.Entity
有问题的变量是在该命名空间内的一个类中定义的,因此我假设如果我将其设为内部,则只有该命名空间内的对象才能访问它。我将程序集和命名空间视为一体,我认为这是不对的。
命名空间仅影响名称解析。命名空间并不意味着任何类型的存储,命名空间也不决定哪些 DLL 包含您的代码。命名空间允许您将相关事物组合在一个逻辑名称下,即使它们可能物理上位于不同的 DLL 中。
程序集基本上只是一个 DLL 或 EXE 文件。它包含描述该 DLL 或 EXE 中代码的 IL 代码和类型信息。它也可以包含许多其他内容,但对于初学者来说,只需将其视为 DLL。
通过将代码编译到生成 DLL 或 EXE 的项目 (csproj) 中,您可以将代码放入特定程序集中。
一个命名空间可以跨越多个程序集。也就是说,作为该逻辑命名空间成员的类可能驻留在多个 DLL 中。只有当您的项目引用包含该类的正确程序集 (DLL) 时,您才能访问源代码中的特定类。
Internal 修饰符意味着只能从同一个程序集中访问该符号。只有编译到与您的代码相同的 DLL 中的代码才能访问带有 internal 标记的属性或方法。
人们很容易对命名空间/程序集感到困惑,因为它解耦了代码物理位置(程序集)和如何引用它的概念(逻辑引用是使用命名空间,物理引用是引用程序集)。
我通常用这个词来解释这个contribute
:
一个程序集可以为多个命名空间做出贡献。
例如,System.Data.dll
程序集有助于命名空间,例如System.Data
(例如 class System.Data.DataTable
)和Microsoft.SqlServer.Server
(例如 class Microsoft.SqlServer.Server.SqlContext
)。
多个程序集可以构成一个命名空间。
例如,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
,所以我不会详细介绍这些。
——杰伦
基本上,您不能使变量仅在给定的命名空间内可见。由于任何人都可以定义任何名称空间,因此这会使想法internal
无效:您只需编写
namespace System
{
public static MySystemInternalSpy
{
public static void SpyInternals()
{
...
}
}
}
例如,访问命名空间中定义的任何变量、类或internal
方法System
。
命名空间和程序集不是同义词。通常一个命名空间跨越多个程序集。从 Visual Studio 构建的任何托管代码都具有一对一的项目到程序集到 DLL/EXE 二进制文件的对应关系。
但是,如果将托管代码与命令行链接,则可以创建一个程序集,其中多个项目文件都属于一个程序集(这意味着磁盘上的多个文件一起代表一个程序集)。但不管这种情况,这是一件深奥的事情,在实践中从未发生过。
“内部”访问修饰符仅意味着只能从该程序集中访问目标。它与命名空间无关。