2011-07-27 25 views
0

我碰到一行代碼,我似乎無法把握C#delegate Func

讓我稍微解釋一下。

我的理解是,用下面一行我定義了一個名爲「myDelegate」的委託類型。這種類型的可以容納一個指針與簽名INT(INT,INT)

public delegate int myDelegate(int a, int b); 

什麼,我不明白的是以下行的函數:

public delegate T Func<T>(T a, T b); 

我的意思是我爲什麼要定義一個名爲類型Func已經在.NET框架中定義了?

回答

4

那麼,當在框架中有一個具有相同名稱和數量的泛型類型參數的可用框架時,聲明自己的委託當然不是個好主意 - 但它不是無效。我建議如果這是你自己的代碼,你可以適當地重命名它。請注意,它與Func<T>不同,因爲它對輸入和輸出都使用T。您可能想要將其稱爲BinaryOperator或類似的東西(儘管二元運算符不必具有相同的操作數類型,也不必具有相同類型的返回值)。

+0

另外,由於OP說他們「遇到了這個代碼」,我想這可能是在.NET 3.5中引入'System.Func '之前寫的。 – Sven

+0

@Sven:沒錯。我總是會忘記.NET 2中存在哪些「Action」和「Func」重載。它只是'Action '? –

+0

'Action '在.Net 2.0中; 'Action'(非泛型)和'Func '(及其泛型重載)不是。 – Sven

0

Func的語法是作爲一種方便,通常最好是標準化他們提供的恕我直言。

功能和動作都方便和易於記憶。相比之下,我發現委託語法有點笨拙。

+0

'Func'不是「語法」 - 它只是框架提供的代表家族。當你說你「發現委託語法有點笨拙」 - 你的意思是聲明一個新的委託類型的語法? –

+0

是的,這就是我的意思。只是我更喜歡看到他們用這種方式表達。不,它不是C#語法,但是您可以將提供的委託合併到您的樣式中。但你的區別是有用的。 – sgtz

0

的.NET Func<T>是不同的:

T Func<T>(); 
T2 Func<T1, T2>(T1 arg); 
T3 Func<T1, T2, T3>(T1 arg1, T2 arg2); 
.. etc 

委託定義是沒有錯的話,那就是將獲得與.NET版本混淆了命名。

相關問題