我想了解C#中的内部访问修饰符。我似乎无法理解程序集到底是什么,程序中的程序部分是什么部分。我试图让这个变量是通俗易懂只能通过物体下面的命名空间中:C#程序集,什么是程序集?
namespace Engine.Entity
有问题的变量在该命名空间内的类定义的,所以我认为,如果我做了它的内部,只有该名称空间内的对象才有权访问它。我看到程序集和命名空间是一体的,我认为这是不对的。
我想了解C#中的内部访问修饰符。我似乎无法理解程序集到底是什么,程序中的程序部分是什么部分。我试图让这个变量是通俗易懂只能通过物体下面的命名空间中:C#程序集,什么是程序集?
namespace Engine.Entity
有问题的变量在该命名空间内的类定义的,所以我认为,如果我做了它的内部,只有该名称空间内的对象才有权访问它。我看到程序集和命名空间是一体的,我认为这是不对的。
命名空间仅影响名称解析。命名空间并不意味着任何类型的存储,名称空间也不会确定哪些DLL包含您的代码。命名空间允许你在逻辑名下将相关的东西组合在一起,尽管它们可能在物理上驻留在不同的DLL中。
程序集基本上只是一个DLL或EXE文件。它包含描述该DLL或EXE中代码的IL代码和类型信息。它也可以包含很多其他的东西,但对于初学者来说,只是把它看作一个DLL。
通过将代码编译到生成DLL或EXE的项目(csproj)中,将代码放入特定程序集。
命名空间可以跨越多个程序集。也就是说,属于该逻辑名称空间成员的类可能驻留在多个DLL中。只有当您的项目引用包含该类的正确程序集(DLL)时,才可以访问源代码中的特定类。
内部修饰符意味着符号只能从相同的程序集中访问。只有与代码编译到同一个DLL中的代码才能访问使用内部标记的属性或方法。
“程序集基本上是DLL或EXE。”没错,但有时它可以是任何类型的文件(jpegs,文本文件等)或同时数个。这是边缘案例(见我对这篇文章的回答)。 – 2010-12-15 14:40:36
是的,组件可以包含/包含一堆东西。与这个问题的级别无关。 – dthorpe 2010-12-15 16:53:00
内部关键字是接入 改性剂的类型和类型成员。 内部类型或成员只能在在同一 装配
文件 访问所以这个来自同一个组件/ DLL,不namespace内表示。
基本上,你不能只在给定的命名空间内使变量可见。由于任何人都可以定义任何命名空间,这将使internal
无效的想法:你只需要编写
namespace System
{
public static MySystemInternalSpy
{
public static void SpyInternals()
{
...
}
}
}
来访问在System
命名空间定义为internal
任何变量,类或方法,例如。
命名空间和程序集不是同义词。命名空间通常跨越几个程序集。从Visual Studio构建的任何托管代码都有一对一对应的项目对应程序集到DLL/EXE二进制文件。但是,如果您将托管代码与命令行关联起来,则可以制作一个程序集,其中多个项目文件都属于一个程序集(这意味着磁盘上的多个文件一起代表一个程序集)。但不要介意这种情况,这是一个在实践中从未发生过的深奥的事情。
“内部”访问修饰符仅表示目标只能从该程序集内访问。它对命名空间没有影响。
人们很容易被名称空间/程序集的东西所困惑,因为它解耦了代码的物理位置(程序集)的概念以及如何引用它(逻辑上引用是通过使用名称空间,物理引用是通过引用组件)。
我通常用这个词contribute
解释:
的组件可以促进多个命名空间。
例如,System.Data.dll
组件对诸如System.Data
(例如类别System.Data.DataTable
)和Microsoft.SqlServer.Server
(例如类别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 Thorpeexplainednamespace
和internal
的概念真的很好,所以我不会详细讨论这些。
- jeroen
+1:像我这样的c#初学者很清楚的解释 – Guillaume07 2012-12-24 07:17:43
看看“.Net Reflector”程序。它会让你打开一个程序集,看看里面有什么。您将看到单个程序集可以包含多个名称空间。 – David 2010-12-15 05:50:07