11

C# のより高度な機能について調べているうちに、違いがよくわからないコードに出くわしました。次の 2 行についてです。

Func<string, int> giveLength = (text => text.Length);

Func<string, int> giveLength = delegate(string text) { return text.Length; };

これは同じように使用できます。

Console.WriteLine(giveLength("A random string."));

基本的に..これらの2つの行の違いは何ですか? これらの行は同じ CIL にコンパイルされていますか?

4

2 に答える 2

18

基本的には同じです。どちらもC# 仕様の用語では無名関数です。

ラムダ式は一般的により簡潔であり、アウトプロセス LINQ にとって重要な式ツリーに変換することもできます。

匿名メソッドを使用すると、気にしない場合はパラメーター リストを削除できます。例えば:

EventHandler handler = delegate { 
    Console.WriteLine("Sender and args don't matter");
};

後者のポイントが必要になることはめったにないため、匿名メソッドは最新の C# で絶滅の危機に瀕しています。ラムダ式は、はるかに一般的です。

于 2012-09-04T16:01:41.223 に答える
6

基本的に..これらの2つの行の違いは何ですか? これらの行は同じ CIL にコンパイルされていますか?

同じことを書くのに2つの異なる方法があります。ラムダ構文はより新しく、より簡潔ですが、同じことを行います (この場合)。

ラムダ (構文)は、デリゲートの代わりに式ツリーを作成する=>ラムダを形成するためにも使用できることに注意してください。これは、LINQ to Objects ( のようなデリゲートに基づく) を使用する場合でも、LINQ to Entities (および式ツリーを使用する場合) を使用する場合でも、同じ構文を使用できるため便利です。Func<T, TResult>IQueryable<T>

于 2012-09-04T16:01:15.807 に答える