2016-01-14 13 views
5

基本上我有一個CS文件定義一個內部類,然後我複製到各種CS項目。這些CS項目的程序集將被加載到應用程序中。該程序似乎運行良好。內部類具有相同的命名空間,但在不同的程序集中?

但是,在同一個命名空間中擁有多個具有相同類名的類使我感到不安,即使它們在每個程序集內部都是內部的。

是通過類名,名稱空間以及AppDomain中的程序集唯一標識的類嗎?

+1

你爲什麼要使用不同的程序集相同的命名空間?這聽起來像是在尋求麻煩。 –

+0

@NickBailey在不同的程序集中使用相同的名稱空間名稱並不是很糟糕,就像'System.dll'和'System.Core.dll'中的'System.Collections.Generic'一樣。 –

回答

8

是通過類名,命名空間以及AppDomain中的程序集唯一標識的類嗎?

簡答:是的。

較長的回答:

有幾點需要考慮的細節。

首先,從CLR的角度來看,沒有像「命名空間」這樣的東西。就CLR而言,字符串類型的名稱是System.String。因此,從CLR的角度來說,更準確地說,一個類型是由其名稱和程序集唯一標識的。

其次,類型可以嵌套。所以類型實際上由它們的名稱唯一標識,包含(如果有的話)和程序集。

第三,類型可能是通用的。 Foo.BarFoo.Bar<T>是不同的類型。所以類型由它們的名稱來標識,包含類型,裝配和通用元數據。

第四,這是奇怪的,CLR考慮使用Load加載的程序集中的類型與裝載了LoadFrom的同一程序集中的類型不同。 CLR告訴你在彙編欄中的Foo類型與彙編欄中的Foo類型不兼容,而男孩,這會讓你感到困惑。

1

儘管它讓所有內部類都只存在於它們各自的程序集中,所以它們是自治的,並且不會被其他程序集中的其他類看到。

但是,從維護和簡單的角度來看,它應該放在房屋保管任務的頂端。

+1

是的,這是一個破解。我的問題更多的是計算科學而不是軟件工程。所以CLR在所有情況下都不會抱怨? – ZZZ

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 
相關問題