2011-07-20 57 views
0

我閱讀有關匿名方法,我試圖環繞這個例子中我的頭:爲什麼這個委託語法是「合法的」?

List<int> evenNumbers = list.FindAll(delegate(int i)
{ return (i % 2) == 0; })

爲什麼是delegate(int i)合法的嗎?您不必聲明new delegate void或類似的東西。

這是匿名方法的意思嗎?這是允許匿名方法的附加語法糖嗎?

+0

自從你開始學習匿名方法,你應該看看'拉姆達expressions'如果您還沒有。我想你可能會覺得它們很有趣。 – Poma

+0

@波馬:謝謝!我接下來就是這樣! :-) – richard

回答

4

由於您懷疑您正在創建一個匿名委託/方法,因此是合法的。

一種替代(使用lambda operator =>)將是:

List<int> evenNumbers = list.FindAll((i) => ((i % 2) == 0)); 

List<int> evenNumbers = list.FindAll(i => i % 2 == 0); 

進一步閱讀參見Lambda Expressions

+1

或沒有6個額外括號的相同事物。 :-) +1 – Mehrdad

+0

你可以通過刪除所有括號來清理它:'var evenNumbers = list.FindAll(i => i%2 == 0);' – Zebi

+1

我保留它們以便更容易看到直接翻譯。 –

0

在這段代碼中,它似乎將一個方法傳遞給使用委託的方法。

1

如果您稍微分解一下該語句,希望它會更加明顯 - 這是等效代碼。

Predicate<int> test = delegate(int i) 
{ 
    return (i % 2) == 0; 
}; 

List<int> evenNumbers = list.FindAll(test); 

正如你可以看到它創建了一個匿名委託(編譯器將轉入幕後的方法)

我個人一直認爲的「內聯」匿名委託語法模糊焦點超過加清晰,而相同的結構使用lambda表達式,一旦你習慣的語法建成,增加了透明度

List<int> evenNumbers = list.FindAll(i => i % 2 == 0);