具有相同命名空间但在不同程序集中的内部类?
Posted
技术标签:
【中文标题】具有相同命名空间但在不同程序集中的内部类?【英文标题】:Internal classes having the same namespaces but in different assemblies? 【发布时间】:2016-01-14 01:28:49 【问题描述】:基本上我有一个定义内部类的 CS 文件,然后我复制到各种 CS 项目。这些 CS 项目的程序集将被加载到应用程序中。该程序似乎运行良好。
但是,在同一个命名空间中有多个具有相同类名的类让我感到不安,即使它们在每个程序集中都是内部的。
一个类是否通过类名、命名空间以及 AppDomain 中的程序集来唯一标识?
【问题讨论】:
为什么在不同的程序集中使用相同的命名空间?这听起来像是在自找麻烦。 @NickBailey 在不同的程序集中使用相同的命名空间名称并不是那么糟糕,就像在System.dll
和 System.Core.dll
中的 System.Collections.Generic
。
【参考方案1】:
一个类是否通过类名、命名空间以及 AppDomain 中的程序集来唯一标识?
简短回答:是的。
更长的答案:
有一些微妙的问题需要考虑。
首先,从 CLR 的角度来看,没有“命名空间”之类的东西。就 CLR 而言,字符串类型的名称是 System.String
。所以更准确的说法是,从 CLR 的角度来看,一个类型由其名称和程序集唯一标识。
其次,类型可以嵌套。所以类型实际上是由它们的名称唯一标识的,包含类型(如果有的话)和程序集。
第三,类型可能是通用的。 Foo.Bar
和 Foo.Bar<T>
是不同的类型。因此类型由它们的名称标识,包含类型、程序集和泛型。
第四,这很奇怪,CLR 认为加载有Load
的程序集中的类型与加载有LoadFrom
的同一程序集中的类型不同。您最终可能会遇到 CLR 告诉您汇编 Bar 中的 Foo 类型与汇编 Bar 中的 Foo 类型不兼容的情况,这令人困惑。
【讨论】:
【参考方案2】:虽然它使事情变得混乱,但您的所有内部类只存在于它们各自的程序集中,因此它们是自治的,不会被其他程序集中的其他类看到。
但从维护和简单性的角度来看,它应该放在家务管理任务的首位。
【讨论】:
是的,这是一个 hack。我的问题更多是关于计算科学而不是软件工程。那么CLR不会在所有情况下都抱怨吗?【参考方案3】:是的,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
【讨论】:
以上是关于具有相同命名空间但在不同程序集中的内部类?的主要内容,如果未能解决你的问题,请参考以下文章
EF4 Poco 问题映射类型相同的名称相同的程序集不同的命名空间
System.Security.Cryptography.HMACSHA1 存在于具有相同命名空间的两个程序集中