考慮例如:C# - 接口 - 型動初始化
IList<string> _lstColl = new[] { "Alex", "Sam", "Gates", "Riaz" };
我可以用來初始化它 爲:
string[] _stringBag = new[] { "Alex", "Sam", "Gates", "Riaz" };
什麼是這裏有接口的優勢是什麼?
考慮例如:C# - 接口 - 型動初始化
IList<string> _lstColl = new[] { "Alex", "Sam", "Gates", "Riaz" };
我可以用來初始化它 爲:
string[] _stringBag = new[] { "Alex", "Sam", "Gates", "Riaz" };
什麼是這裏有接口的優勢是什麼?
好處在於它向讀者展示了您沒有使用它恰好是數組的事實。我傾向於將局部變量聲明爲最通用的類型,其中包含我需要的所有功能。例如,我會這樣做:
using (TextReader reader = File.OpenText(...))
而不是指定StreamReader
。
很少有巨大很重要,但它確實可以更容易地更改實施的細節。例如,假設無論出於何種原因,我們想要更改示例以使用List<T>
而不是數組。
你可以改變這一點:
IList<string> _lstColl = new[] { "Alex", "Sam", "Gates", "Riaz" };
這樣:
IList<string> _lstColl = new List<string> { "Alex", "Sam", "Gates", "Riaz" };
,並知道它仍然編譯。一些語義可能不一樣,所以你仍然需要小心 - 但至少你知道它不會使用任何數組特定的方法。
這是generics的一個示例,您將創建一個字符串數據類型的IList。
泛型引入到.NET 框架的類型 參數概念,這使得有可能設計 類和方法的是推遲 一種或多種類型 直到類或方法的說明書中被聲明 並由客戶端代碼實例化。例如,對於 示例,通過使用參數T的通用類型 ,您可以編寫單個 類,其他客戶端代碼可以使用 而不會產生運行時轉換或裝箱操作的成本或風險。
更多在這裏閱讀
對不起!本來會構思我的問題,更具體。間接初始化接口有什麼好處(當然,我們不能爲接口創建實例)。 – user160677 2009-08-22 09:36:11
我不認爲這個問題真的是關於泛型。 – 2009-08-22 09:42:18
有沒有優點還是缺點。如果你的代碼需要一個IList,那就給它一個。如果你的代碼需要一個數組,然後給它一個。
有缺點。看到我的答案。 – 2009-08-22 09:43:22
我真的不明白爲什麼一個數組實現IList。當你調用Add時,它會拋出一個異常。 數組沒有IList語義,因爲它不可調整大小。這就是爲什麼我避免有IList陣列。如果我需要一個名單,我會寫這樣的:
IList<string> _lstColl = new List<string>() { "Alex", "Sam", "Gates", "Riaz" };
(PS:有相當多的問題與使用標準架構的集合接口,如缺少方法,甚至缺少的接口當你。正在處理集合接口,像往常一樣,例如在使用NHibernate時,你會發現它們有時設計的很糟糕,這個接口的開發人員似乎並沒有使用它們,只是我的看法。)
這是因爲沒有獨立的接口,只有索引器和計數。 – 2009-08-22 09:35:54
是的,請參閱我的PS關於收集界面。我對.NET收集設計感到非常失望。我的意思是,這些列表類型和語義自數十年以來就廣爲人知。爲什麼他們想出了一個帶有如此糟糕收藏品設計的新框架? – 2009-08-22 09:40:04
不是C而不是Python! *G – 2009-08-22 09:37:05