2009-07-28 189 views
13

請原諒我,如果這個尖叫新手但=>在C#中的含義是什麼?上週我正在做一個演講,這個運營商(我認爲)是在ORM的背景下使用的。在我回到筆記之前,我並沒有真正關注語法的細節。「=>」是什麼意思?

+0

這是一個重複。我找不到那一個。 – 2009-07-28 19:57:20

+0

雖然這很難搜索。即使在Google上。 – 2009-07-28 20:16:51

+0

他不知道它被稱爲「lambda操作符」。 – 2009-07-28 20:21:40

回答

13

在C#的lambda operator被寫入 「=>」(通常是發音爲 「」 當朗讀)。這意味着左側的參數被傳遞給右側的代碼塊(lambda函數/匿名委託)。所以如果你有一個Func或者Action(或者他們的任何一個具有更多類型參數的表兄弟),那麼你可以給它們分配一個lambda表達式,而不需要實例化一個委託或者有一個單獨的延遲處理方法:

//creates a Func that can be called later 
Func<int,bool> f = i => i <= 10; 
//calls the function with 12 substituted as the parameter 
bool ret = f(12); 
+4

我從來沒有注意到當你將lambda與'小於或等於'粘在一起時有多混淆。它最終看起來像所有箭頭指向我。 – 2009-07-28 20:09:30

1

這是一個lambda運算符,是lambda expression的一部分。

所有lambda表達式使用拉姆達 運算符=>,它讀作 「去 於」。 lambda 運算符的左側指定輸入 參數(如果有的話),並且右側 包含表達式或語句 塊。 lambda表達式x => x * x被讀取爲「x轉到x次x」。

7

它是簡寫爲lambda的簡寫。

i => i++ 

是(排序的)一樣寫作:

delegate(int i) 
{ 
    i++; 
} 

在的上下文中:

void DoSomething(Action<int> doSomething) 
{ 
    doSomething(1); 
} 

DoSomething(delegate(int i) { i++; }); 
//declares an anonymous method 
//and passes it to DoSomething 

,它是(排序的)一樣寫作:

void increment(int i) 
{ 
    i++; 
} 

只是沒有給它一個名字,它可以讓你在線聲明一個函數,稱爲「匿名」函數。

3

當大聲說出運算符是lambda時(轉到)運算符有助於定義您在lambda中定義的匿名委託。

一個常見的地方看到這是一個事件處理程序。通過使用

this.Loaded += (o, e) => { 

// code 

} 

您已經定義了一個匿名方法處理Loaded事件(它沒有名字):你會經常有由拉姆達用下面的代碼來處理AA頁面加載事件類型lambda表達式。它會讀作「o,e去......用foo定義方法」。

1

這是聲明匿名函數的語法,在C#中稱爲「lambda表達式」。

例如,(int p) => p * 2表示一個函數,它接受一個整數並將其乘以2。

+0

從技術上講,整體(int p)=> p * 2是一個lambda表達式。 =>只是lambda運算符。 – 2009-07-28 20:17:30

3

這是「lambda操作符」,並且您將其讀作「轉至」。假設你有聲明:

doSomething(x => x + " hi"); 

可以代替「=>」在你的心中有這樣的:

doSomething(delegate (string x) { return x + " hi" }); 

正如你所看到的,它提供了一個速記的挫折感。編譯器會計算出您傳遞的變量的類型,並允許您擺脫傳遞簽名變量的代碼的函數簽名和包圍。

8

由於沒有人提到它,但在VB.NET你使用function關鍵字來代替=>,就像這樣:

dim func = function() true 
'or 
dim func1 = function(x, y) x + y 

dim result = func() ' result is True 
dim result1 = func1(5, 2) ' result is 7