25

匿名メソッドとラムダ式を簡潔に区別できる人はいますか?

匿名メソッドの使用法:

private void DoSomeWork()
{
    if (textBox1.InvokeRequired)
    {
        //textBox1.Invoke((Action)(() => textBox1.Text = "test"));
        textBox1.Invoke((Action)delegate { textBox1.Text = "test"; });
    }
}

強く型付けされたデリゲートにキャストされているのは通常のラムダ式だけですか、それとももっと隠れています。

次のような強く型付けされたデリゲートがあることをよく知っています

UpdateTextDelegate mydelegate = new UpdateTextDelegate(MethodName)

type のパラメーターとして十分ですSystem.Delegateが、匿名メソッドのアイデアは私にとってかなり新しいものです。

4

3 に答える 3

7

注意すべき微妙な違いが 1 つあります。次のクエリを検討してください (ことわざの NorthWind を使用)。

Customers.Where(delegate(Customers c) { return c.City == "London";});
Customers.Where(c => c.City == "London");

1 つ目は匿名デリゲートを使用し、2 つ目はラムダ式を使用します。両方の結果を評価すると、同じことがわかります。しかし、生成された SQL を見ると、まったく別のことがわかります。最初の生成

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [Customers] AS [t0]

一方、2番目は生成します

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [Customers] AS [t0]
WHERE [t0].[City] = @p0

最初のケースでは、where 句がデータベースに渡されていないことに注意してください。どうしてこれなの?コンパイラは、ラムダ式が式ツリーとして保持できる単純な単一行の式であると判断できますが、匿名デリゲートはラムダ式ではないため、 としてラップできませんExpression<Func<T>>。最初のケースの結果として、Where 拡張メソッドに最適なのは、Expression<Func<T, bool>>.

この時点では、匿名デリゲートはほとんど役に立ちません。それはより冗長で柔軟性に欠けます。一般に、匿名デリゲート構文よりも常にラムダ構文を使用し、解析可能性と構文の簡潔さを考慮することをお勧めします。

于 2013-07-17T21:00:54.947 に答える