基本上我有一个定义内部类的CS文件,然后我复制到各种CS项目。并且这些CS项目的程序集将加载到应用程序中。该程序似乎运行得很好。
但是,在同一名称空间中拥有多个具有相同类名的类会让我感到不安,即使它们在每个程序集中都是内部的。
是通过类名,命名空间以及AppDomain中的程序集唯一标识的类吗?
答案 0 :(得分:8)
是通过类名,命名空间以及AppDomain中的程序集唯一标识的类吗?
简答:是的。
更长的答案:
有一些微妙的要点需要考虑。
首先,从CLR的角度来看,没有“命名空间”这样的东西。就CLR而言,字符串类型的名称是System.String
。因此,更准确地说,从CLR的角度来看,类型由其名称和程序集唯一标识。
其次,类型可以嵌套。因此,类型实际上由其名称唯一标识,包含类型(如果有)和汇编。
第三,类型可能是通用的。 Foo.Bar
和Foo.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