2011-05-15 54 views
9

可能有人解釋什麼匿名方法是在C#(以簡單的術語),並在可能的提供範例請什麼是C#中的匿名方法?

+1

你可能會在這裏找到答案有用:http://stackoverflow.com/questions/208381/whats-the-difference-between-anonymous-methods-c-2-0-and-lambda-expressions – 2011-05-15 11:33:16

回答

19

將匿名方法引入到C#2中作爲創建委託實例的一種方式,而無需編寫單獨的方法。他們可以用捕獲內部的局部變量,使其成爲關閉的一種形式

匿名方法看起來像:

delegate (int x) { return x * 2; } 

,並且必須被轉換到一個特定的委託類型,例如通過分配:

Func<int, int> foo = delegate (int x) { return x * 2; }; 

...或訂閱的事件處理程序:

button.Click += delegate (object sender, EventArgs e) { 
    // React here 
}; 

欲瞭解更多信息,請參見:

注意,在C#3 lamdba詞彙具有幾乎完全取代了匿名方法(雖然他們仍然是完全有效的,當然)。匿名方法和lambda表達式共同描述爲匿名函數

+0

值得補充的是,匿名方法存在於本地範圍內,這意味着它們不能在程序中的其他地方共享或暴露出程序集。如果您需要重用代碼,您需要編寫一個可以調用的專用方法。 – Damian 2014-04-07 20:49:15

+0

@Damian:我不認爲值得這麼說 - 我不記得有人想要做*(不像匿名*類型*)。我認爲從語法上來看這很明顯。 – 2014-04-07 20:50:24

5

匿名方法是用在通常將需要的方法和不具有一個代碼塊名稱(因此是匿名的)。

MSDN has examples of using anonymous methods

+0

所以你會那麼不需要創建一個類?我認爲該方法可以從其他方法調用? – James 2011-05-15 11:35:43

+0

@詹姆斯 - 不,你不需要創建一個類來保存匿名方法。該方法可以在傳遞給它的任何地方被調用 - 你不能在以後沒有引用它的時候調用它 - 它是匿名的。 – 2011-05-15 11:40:15

+1

謝謝,你能指定一個可能需要匿名方法的情況嗎? – James 2011-05-15 11:41:48

10

匿名方法是根本沒有名稱的方法,該方法已經聲明,例如:

Button myButton = new Button(); 
myButton .Click += 
delegate 
{ 
    MessageBox.Show("Hello from anonymous method!"); 
}; 
+0

這是隱含的行動?如果我將這個分配給一個變量,然後將該變量添加到'myButton.Click',我將不得不使用EventHandler作爲變量類型,即使它不使用參數。 – 2013-08-22 14:33:38

4

這些都是沒有名字的方法。

例如,普通的方法是:

public void Foo() 
{ 
    Console.WriteLine("hello"); 
} 

雖然匿名方法可以是:

myList.ForEach(item => Console.WriteLine("Current item: " + item)); 

ForEach中的代碼實際上是一個方法,但還沒有名字,你不能打電話它從外面。

+4

這不是一個匿名方法 - 這是一個lamdba表達式。 Lambda表達式和匿名方法統稱爲匿名函數。 – 2011-05-15 12:03:13

+0

謝謝@Jon我只是想按照OP要求以簡單的詞語簡單地說出單詞。歡呼300K! ;) – 2011-05-15 12:14:03