2012-06-12 69 views
0

我是C#中的新成員,從​​PHP開始。一切都幾乎清楚了,除了我不知道究竟是什麼意思,建設界面/系列<>C#中究竟意味着什麼<>?

我已經在使用「<>」作爲「類型定義」,但它意味着什麼。我使用它是這樣的:

class TaskComparer : IEqualityComparer<Task> ... 
class TaskQueue : ConcurrentQueue<Task> ... 

等你有沒有看到這方面的文章?請發佈一個鏈接。謝謝。

+0

你是什麼意思「構建接口/集合'<>'」?你可以更具體一些,發表示例代碼? –

+0

我已將其寫入問題。 – Fanda

回答

5

它被稱爲「泛型」,它是一種(如你所說)定義類型參數的方法。以下是關於MSDN的介紹性文章:http://msdn.microsoft.com/en-us/library/ms172192.aspx

作爲此實用程序的一個簡單示例,請考慮一個Repository模式。

public interface IRepository<T> { 
    public void Add (T obj); 
    public IEnumerable<T> GetAll(); 
} 

通過正確的實現,現在您可以爲任何類型的實體設置存儲庫接口。

public void someMethod(IRepository<Person> personsRepo) 
{ 
    IEnumerable<Person> persons = personsRepo.GetAll(); 
    // ... 
} 
2

標識符的標識符之後<類型定義>

塊表示從generic type definition構造的類型。

這這個定義是遞歸:你可以從其他泛型類型構造的泛型類型:在你可以有數組的數組以同樣的方式,你可以構造一個字典的列表的列表,列表等。

此外,您可以使用類似的構造來構建泛型函數,除了替代類型或接口名稱,您可以使用通用函數的名稱。

您可以構建自己的泛型類型和函數定義,並直接或通過反射來訪問它們。這個概念非常強大,因爲它擴展了對其他類型構建的類型的強大輸入。

0

在集合的情況下,它定義集合內部的哪種類型的數據。這只是一種improfe類型安全性的方法。一個小例子:

ArrayList<Integer> test = new ArrayList<Integer>(); 

test.Add(1); // will work 
test.Add("2"); //will throw an exception, String cannot be cast to int 
+3

這是一個Java示例,最後一行不會拋出異常 - 它將無法編譯。 –

+1

給定類似的代碼,它也無法在C#中編譯。 –

0

請閱讀其他人提供的關於仿製藥的文章;不過,我在這裏給你快速介紹。

說,我們要編寫一個id函數(完全返回它的輸入)。這應該適用於每種類型,對嗎?所以,我們很自然的做法是使用object

object id(object x) { 
    return x 
} 

然而,每次都返回object - 你要轉換後取回你的「混凝土」式的,就像這樣:int x = (int)id(12)。泛型解決了這個問題。它們允許你參數化類型,以保持它一模一樣

T id2<T> (T x) { 
    return x 
} 

望着類型簽名,你可以看到,這個版本需要任何T並返回相同T(更換Tint,你會看到)。

我希望能給你一個快速的概述。另外,請閱讀約束。

相關問題