2016-12-24 4 views
1

ラムダ関数の呼び出しとDispatcherでのデリゲートの明示的な呼び出しの違いは何ですか?つまり、次の違いは何ですか:Dispatcher.BeginInvokeのLambda vs.(Action)デリゲート

Dispatcher.BeginInvoke(new Action(() => Foo())); 

Dispatcher.BeginInvoke((Action)delegate() { Foo(); }); 

private void Foo() { } 
+0

それだけで歴史的アーティファクトです。匿名メソッドがC#バージョン2で追加されました。バージョン3ではより普遍的なラムダ式構文を追加することを十分に自信と経験を与えました。まだanonメソッドを使用することはそれほど有用ではありません。 –

答えて

3

のように行うことができます。コードの両方の行が(ILSpyによって例えば図示)同じMSIL codeを製造:

IL_000f: ldarg.0 
IL_0010: call instance class [WindowsBase]System.Windows.Threading.Dispatcher [WindowsBase]System.Windows.Threading.DispatcherObject::get_Dispatcher() 
IL_0015: ldarg.0 
IL_0016: ldftn instance void WpfApplication2.MainWindow::'<.ctor>b__0_0'() 
IL_001c: newobj instance void [mscorlib]System.Action::.ctor(object, native int) 
IL_0021: ldc.i4.0 
IL_0022: newarr [mscorlib]System.Object 
IL_0027: callvirt instance class [WindowsBase]System.Windows.Threading.DispatcherOperation [WindowsBase]System.Windows.Threading.Dispatcher::BeginInvoke(class [mscorlib]System.Delegate, object[]) 
3

違いはありません。

どちらの場合でも、foo()を呼び出す匿名メソッドを定義します。

ノートは:違いはありません。この

Dispatcher.BeginInvoke(Foo); 
関連する問題