簡體   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