命名空间还是程序集?

96

我对命名空间和程序集感到非常困惑。 System.DataSystem.Web是命名空间还是程序集?

我注意到它们被称为命名空间,同时它们也存在于GAC_32文件夹中。 那么它们到底是什么?


1
看看这个链接可能会有所帮助:https://dev59.com/JkbRa4cB1Zd3GeqP5PRK?rq=1。 - p.s.w.g
9个回答

111

System.Data是一个命名空间,System.Data.DLL(文件)是一个程序集。

命名空间是类型的逻辑组合(主要用于避免名称冲突)。程序集可以包含多个命名空间中的类型(System.DLL包含一些...),而单个命名空间可以分布在多个程序集中(例如System.Threading)。


2
我们如何指定哪个命名空间属于哪个程序集? - Ehsan Sajjad
1
@EhsanSajjad 两者之间没有直接的关系。一个程序集是由代码文件构建而成的(通常通过项目),每个文件都包含在命名空间中的类。因此,您通过选择哪些文件在项目中来_间接_决定它。如果这并没有帮助到您,请随时提出新问题。 - D Stanley
it makes sense. Thanks!! - Ehsan Sajjad
1
通过在源代码中使用C#的“namespace”语句(或其他.NET语言中的等效语句)来创建您的程序集。请注意,第二个程序集可以重新打开一个命名空间并向其中添加更多的类。 - Concrete Gannet

70

命名空间 是指属于同一功能的类的逻辑分组。所以 System.WebSystem.Data 都是命名空间。

MSDN 将其描述为:

在 C# 编程中,命名空间有两种重要用途。首先,.NET Framework 使用命名空间来组织其众多的类。其次,声明自己的命名空间可以帮助控制较大编程项目中类和方法名称的作用域。

namespace

程序集 是可以由 .NET 运行时环境执行的 (预编译) 代码块。它包含一个或多个命名空间。一个 .NET 程序由一个或多个程序集组成。

System.Web.dllSystem.Data.dll 都是程序集。

MSDN 将其描述为:

程序集是 .NET Framework 应用程序的构建块,它们形成部署、版本控制、重用、激活作用域和安全权限的基本单元。程序集是一组类型和资源,它们被构建成一起并形成逻辑功能单元。程序集提供了常规语言运行时所需的有关类型实现的信息。对于运行时来说,类型在程序集的上下文之外是不存在的。

assembly


两种方式?第二个在哪里? :) - Jugal Thakkar
1
@JugalThakkar 也加入了它。在此处查看更多详细信息。 - Zaheer Ahmed
稍微换个说法:命名空间有两个目的。其一是为类型提供分层的“目录”,这样您可以更轻松地定位或发现它们。如果您能记住命名空间的名称,IntelliSense 将为您提供其类型的简短列表。其二是管理和避免名称冲突。如果您可以避免使用“System”、“Microsoft”和“Windows”这些命名空间,您就可以确保您的任何类型都不会与 Microsoft 的类型冲突。 - Concrete Gannet

18
简而言之:
汇编语言:
汇编是物理代码组合的基本单位。它是一个输出单元,也是部署和版本控制的单位。汇编包含MSIL代码。
命名空间:
命名空间是逻辑代码分组的基本单位。它是一组名称,其中每个名称都是唯一的。它们形成一组类的逻辑边界。必须在项目属性中指定命名空间。

15

它们是命名空间。程序集包含一个以上的命名空间。例如:System.dll 包含以下命名空间(以及更多):

enter image description here

一个命名空间可能包含嵌套的命名空间。它们只是用来组织代码的逻辑名称。请注意,DLL 文件是包含一个或多个命名空间的程序集。

GAC全局程序集缓存。根据MSDN:

全局程序集缓存存储专门用于在计算机上由多个应用程序共享的程序集。

因此,常用的程序集存储在 GAC 中,因此您不需要将所有程序集文件复制到从项目中引用的项目目录中。存储在 GAC 中的程序集均为 Strong-Named 程序集。通常,当您从项目中添加对未经 Strong-Named 处理的程序集的引用时,会在您的 bin\Debug 文件夹中创建一个副本 of 您的 .dll 文件。如果您希望,可以使您的程序集(例如,类库项目)成为 Strong-Named。请参见:如何:使用强名称签名程序集


那么是谁或什么决定多个程序集呢?我创建了一个带有许多命名空间的项目。是什么决定了要创建多少程序集,以及哪些命名空间属于哪个程序集? - eaglei22

15

简而言之:

  • 程序集被存储为 .EXE 或 .DLL 文件。
  • 命名空间是一种将类型名称分组并减少名称冲突机会的方式。

提示。

程序集包含多个类型(例如:程序集 System 包含许多包括 System, System.IO 等在内的命名空间)。 通常,程序集的名称与它所包含的命名空间相同,但不总是如此。

其它程序集和命名空间示例。

程序集 1 (CoreAssembly.DLL)

包含命名空间 Namespace1.subnamespace1

程序集 2 (ExtensionCoreAssembly.DLL)

包含命名空间 Namespace1.subnamespace1

可以使用包含不同命名空间的程序集名称,并通过这种技术扩展现有程序集来扩展另一个程序集。

定义.

程序集

程序集是一组类型和资源,形成一个逻辑功能单元。.NET Framework 中的所有类型都必须存在于程序集中;公共语言运行时不支持程序集外的类型。每次使用 Visual Basic .NET 创建 Microsoft Windows 应用程序、Windows 服务、类库或其他应用程序时,都正在构建单个程序集。每个程序集被存储为 .exe 或 .dll 文件。 注意 虽然在技术上可以创建跨多个文件的程序集,但在大多数情况下不太可能使用此技术。

命名空间

组织 Visual Basic .NET 代码的另一种方法是使用命名空间。命名空间不是程序集的替代品,而是补充程序集的第二种组织方法。命名空间是一种将类型名称分组并减少名称冲突机会的方式。命名空间可以包含其他命名空间和类型。类型的完整名称包括包含该类型的命名空间的组合。

链接:http://msdn.microsoft.com/en-us/library/ms973231.aspx


11

其他人已经给出了非常好的和详细的答案。但是我想指出,当你不确定时,可以在MSDN上查找。MSDN库非常清晰简洁地解释了任何给定类型所在的命名空间程序集。它甚至说出了文件的名称(在System.Data.dll中),因此没有歧义。

进入图片描述


9
在GAC中看到的文件是 System.Data.dll,这是一个包含命名空间(包括 System.Data)的程序集。如果您在 Visual Studio 中查看引用属性,则会看到:

enter image description here

稍后,如果您右键单击引用并选择在对象浏览器中查看,则会看到该特定程序集中的命名空间。

enter image description here


6
正如@amdluigi所说,“通常,程序集的名称与其包含的命名空间相同,但并非总是如此”。
上面是Visual Studio中Object Browser中System.Data.dll的截图,它是一个很好的示例,可以用来探讨这里的问题。请注意,大多数包含在程序集中的命名空间都属于System.Data或System.Data的子命名空间。
一般来说,将程序集名称与其中的命名空间相关联是一个好习惯。请注意,在Studio创建用于构建程序集的项目时,其中一个项目属性是默认命名空间。初始时,Studio将默认的命名空间命名为与项目本身相同的名称。如果您曾经选择重命名项目,请考虑同时更改其默认命名空间。
有两个额外的命名空间:Microsoft.SqlServer可以理解。一些SQL Server类型没有打算打包在单独的程序集中。
但是System.Xml怎么了????有一个System.Xml.dll程序集。为什么这个命名空间也出现在System.Data.dll中?
请注意,程序集可以重新打开一个命名空间并增加更多内容——这正是System.Data.dll正在使用的System.Xml命名空间做的。
原因是命名空间不会对性能产生影响,但程序集确实会。如果您有1000个具有大量代码的类,那么您不希望一个程序集具有非常大的内存占用。您也不希望有1000个每个只包含一个类的程序集。在其内容可以执行之前,需要将任何程序集加载到内存中。您想要一个程序集包含合理数量的相互关联的类,以便一旦应用程序加载了程序集以获取其其中一个类,它会免费获取应用程序可能需要的其他类。粒度很重要:不要太大,也不要太小,刚好合适。
请注意,System.Data.dll重新打开System.Xml并添加了一个类:XmlDataDocument。碰巧这个类用于将关系数据解释为XML文档。如果您的应用程序只是使用XML,则不需要此类。如果您的应用程序处理关系数据,则可能需要。因此,虽然XmlDataDocument继承自XmlDocument并位于System.Xml命名空间中,但它被打包在System.Data.dll程序集中。
所有这些对于具有Java背景的人尤其重要,在Java中只有一个概念,即“package”。在.NET中有两个概念:程序集和命名空间。两者是正交的。显然,程序集可以包含多个命名空间。程序集可以重新打开命名空间并增加更多内容-换句话说,命名空间中的类型可能跨越多个程序集。

3

汇编语言是逻辑单元的物理分组,命名空间(logical units)是类的逻辑分组。

命名空间可以跨越多个汇编语言(assembly)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接