2010-02-27 72 views

回答

22

基本上,只有當你想從不同的程序集中使用具有相同完全限定名稱(相同名稱空間,相同類型名稱)的兩種類型時才真正需要它。您爲每個程序集聲明不同的別名,以便通過該別名引用它們。

不用說,你應該儘量避免陷入這種情況下手:)

安森霍頓有good blog post了。

+0

只是添加 - 即使在添加extern別名聲明位於comsumer * .cs文件的頂部,編譯器默認情況下不會查找我正在使用的類型(它存在於該程序集中)。編譯器的默認行爲始終是在當前搜索類和類型並引用具有'全局'別名的程序集。我最終使用以extern別名開頭的完全限定類型名稱,例如我的extern別名聲明是'extern alias WidgetsVendor1;'並且仍然在編寫類似於'var wid = new WidgetsVendor1.Widgets.Widget();'的代碼。'我不能簡單地這樣做 - 'var wid = new Widgets.Widget() ;' – RBT 2016-10-19 00:35:17

+1

@RBT:不,它只聲明別名。但是,你可以使用WidgetsVendor1.Widgets;並且寫下var wid = new Widget();'。 – 2016-10-19 06:01:38

+0

ohh。有趣!我不知道。我根據我在早上觀察到的情況張貼了我的評論。很高興知道。我可以使用'using'關鍵字在extern別名中導入名稱空間。謝謝。 – RBT 2016-10-19 07:08:42

23

它可以幫助您擺脫由版本控制挖出的真正深邃的洞穴。你說你的程序的第一個版本使用這個類

using System; 

namespace Acme.Financial.Banking { 
    [Serializable] 
    public class BankAccount { 
    public double Balance { get; set; } 
    //... 
    } 
} 

,你被序列化大量的銀行賬戶記錄它。和會計師開始抱怨資產負債表一美分的十億被關閉,所以你更改類:

public decimal Balance { get; set; } 

問題解決了,接下來的客戶有幸福的資產負債表。直到您被要求用舊格式的許多序列化記錄來升級現有客戶時才需要。大問題,你不能反序列化記錄了,因爲類已經改變了。

extern別名解決了您的問題,即使名稱空間名稱和類名稱相同,也可以在代碼中引用舊版本和新版本的類。

+1

使用extern別名非常有洞察力的用例。 – RBT 2016-10-19 00:42:35

相關問題