私はC#のラムダ式にかなり慣れていませんが、コードを最小化する以外の利点が何であるかわからないため、ラムダ式を使用しない傾向があります。一部/すべての場合でより効率的ですか?または、1行にコードを追加する以外に、達成できる素晴らしいことはありますか?
2 に答える
一部/すべての場合でより効率的ですか?
一般に、ラムダ式は、開発者の効率よりもパフォーマンスの効率に関するものではありません。
これらは、メソッドを手動で作成するよりもはるかに生産的な方法でメソッドを作成する方法です。そうは言っても、彼らは(直接)パフォーマンスを改善するために何もしません。
ただし、機能的に機能するフレームワークを適切に利用する(つまり、LINQを使用する)ことで、フレームワーク自体が高度に最適化される可能性が高いため、効率的なコードを作成する可能性を高めることができます。
ラムダ式はパフォーマンスが高くなく、単純です。それらは主に次の目的で使用されます。
- デリゲートの作成
- LINQの式の作成
- デリゲートのキャプチャにローカル変数を配置する
デリゲートを作成する場合、コンパイラーが作成するコードは、名前付きメソッドを作成し、そのメソッドへのデリゲートを取得した場合とまったく同じです。
Func<int, int> mul = n => n * 2;
に比べ:
public static int Mul(int n) {
return n * 2;
}
Func<int, int> = Mul;
式を作成するとき、コンパイラは式ツリーを作成します。このツリーは、デリゲートに変換することも、LINQプロバイダーが他の何かに変換するために使用することもできます。たとえば、Linq To Sqlプロバイダーは、式をSQLコードに変換します。
デレアージュを作成するメソッドで宣言されたローカル変数を使用するデリゲートを作成する場合、変数をスタックに配置する代わりに、その変数が存在する場所にクロージャオブジェクトが自動的に作成されます。これは、メソッドが宣言されているクラスのフィールドにすることで、名前付きメソッドで変数を使用できるようにする方法と似ています。
int x = 2;
Func<int, int> mul = n => n * x;
に比べ:
public class Closure {
public int x;
public int Mul(int n) {
return n * x;
}
}
Closure c = new Closure;
c.x = 2;
Func<int, int> mul = x.Mul;