繁体   English   中英

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

[英]Internal classes having the same namespaces but in different assemblies?

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

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

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

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

简短回答:是的。

更长的回答:

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

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

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

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

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

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

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

是的,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM