2012-08-03 98 views
0

我以Lambda表達式開始瞭解如何定義使用它的匿名方法。Lambda表達式中的多個句子

我有以下簡單的代碼:

delegate void AddNumber(int number); 
class LambdaExpressionSample 
{ 
    static void Main(string[] args) 
    { 
     AddNumber method = r => Console.WriteLine(r + r);Console.Read(); 
     method(1); 
    } 
} 

我想的是,該方法將等於這個:

AddNumber method = new AddNumber(delegate(int number) 
{ 
    Console.WriteLine(number+number); 
    Console.Read(); 
}); 

但與lambda表達式的代碼無法正常工作因爲lambda表達式顯然以分號「;」結束在Console.WriteLine之後。

我如何使我的方法執行Console.WriteLine和Console.Read使用我的lambda示例?

+0

正如其他人已經回答,你只需要在這裏一些花括號。 – 2012-08-03 08:31:24

+0

很少有必要像這裏一樣製作委託類型。如果你使用的是局部變量,'var'語法可能是最好的方法。對於明確的類型(例如方法參數),我會使用Func <>和Action <>類型。這裏你有一個動作,因爲沒有返回類型,所以你會說'動作'而不是'AddNumber'。調用這個委託'AddNumber'意味着它做了什麼,但是這種類型沒有任何意義。我更喜歡讓類型描述委託的簽名,並將變量的名稱賦予其含義。 – 2012-08-03 08:39:50

回答

1

你必須使用大括號,如果你有一個以上的語句

AddNumber method = r => 
{ 
    Console.WriteLine(r + r); 
    Console.Read(); 
}; 
+0

謝謝,只是仍然是「;」在} – Jose3d 2012-08-03 08:29:39

+0

是的,這只是示例如何使其工作。 – Madman 2012-08-03 08:37:25

2

你可以簡單地包裹這樣的大括號之間的代碼:

delegate void AddNumber(int number); 
class LambdaExpressionSample 
{ 
    static void Main(string[] args) 
    { 
     AddNumber method = r => 
     { 
      Console.WriteLine(r + r); 
      Console.Read(); 
     }; 
     method(1); 
    } 
} 

Action封裝,有一個方法單個參數並且不返回值。因此,爲了避免在你的代碼到處都是自定義的委託代理地獄,你應該使用:

Action<int> addNumber; 

代替:

delegate AddNumber(int number); 

而且這裏是你的新代碼的更改:

class LambdaExpressionSample 
{ 
    static Action<int> addNumber; 
    static void Main(string[] args) 
    { 
     this.addNumber = r => 
     { 
      Console.WriteLine(r + r); 
      Console.Read(); 
     }; 
     this.addNumber(1); 
    } 
} 
+0

非常感謝!! – Jose3d 2012-08-03 08:31:59

0

添加大括號用於多行代碼解決您的問題

AddNumber method = r => 
       { 
         Console.WriteLine(r + r); 
         Console.Read(); 
       };