[英]Internal classes having the same namespaces but in different assemblies?
基本上我有一個定義內部類的CS文件,然后我復制到各種CS項目。 並且這些CS項目的程序集將加載到應用程序中。 該程序似乎運行得很好。
但是,在同一名稱空間中具有相同類名的多個類使我感到不安,即使它們在每個程序集內部也是如此。
是通過類名,命名空間以及AppDomain中的程序集唯一標識的類嗎?
是通過類名,命名空間以及AppDomain中的程序集唯一標識的類嗎?
簡短回答:是的。
更長的回答:
有一些微妙的要點需要考慮。
首先,從CLR的角度來看,沒有“命名空間”這樣的東西。 就CLR而言,字符串類型的名稱是System.String
。 因此,更准確地說,從CLR的角度來看,類型由其名稱和程序集唯一標識。
其次,類型可以嵌套。 因此,類型實際上由其名稱唯一標識, 包含類型 (如果有)和匯編。
第三,類型可以是通用的。 Foo.Bar
和Foo.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.