内部类具有相同的命名空间但在不同的程序集中?

时间:2016-01-14 01:28:50

标签: c#

基本上我有一个定义内部类的CS文件,然后我复制到各种CS项目。并且这些CS项目的程序集将加载到应用程序中。该程序似乎运行得很好。

但是,在同一名称空间中拥有多个具有相同类名的类会让我感到不安,即使它们在每个程序集中都是内部的。

是通过类名,命名空间以及AppDomain中的程序集唯一标识的类吗?

3 个答案:

答案 0 :(得分:8)

  

是通过类名,命名空间以及AppDomain中的程序集唯一标识的类吗?

简答:是的。

更长的答案:

有一些微妙的要点需要考虑。

首先,从CLR的角度来看,没有“命名空间”这样的东西。就CLR而言,字符串类型的名称是System.String。因此,更准确地说,从CLR的角度来看,类型由其名称和程序集唯一标识。

其次,类型可以嵌套。因此,类型实际上由其名称唯一标识,包含类型(如果有)和汇编。

第三,类型可能是通用的。 Foo.BarFoo.Bar<T>是不同的类型。所以类型由它们的名称标识,包含类型,程序集和通用arity。

第四,这是奇怪的,CLR认为加载Load的程序集中的类型与加载LoadFrom的同一程序集中的类型不同。你最终可能会遇到CLR告诉你程序集栏中的类型Foo与程序集栏中的类型Foo不兼容的情况,而男孩,这是令人困惑的。

答案 1 :(得分:1)

虽然它会使事情变得混乱但是所有内部类只存在于它们各自的程序集中,所以它们是自治的,并且不会被其他程序集中的其他类看到。

但从维护和简洁的角度来看,它应该放在房屋保持任务的顶端。

答案 2 :(得分:1)

是的,CLR使用程序集来识别每种类型。如果您编译一个简单的Hello World应用程序并查看IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello world"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main

您可以通过包含程序集,命名空间和类名来查看System.Console的引用方式。但是,如果要引用同一程序集中的类型,则可以隐含程序集名称,例如:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello world"
  IL_0006:  call       void ConsoleApplication1.Foo::Write(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main