Func <T>()とFunc <T> .Invoke()


83

Funcを直接呼び出すことと、Invoke()を使用することの違いに興味があります。違いはありますか?最初のシンタックスシュガーであり、とにかくその下でInvoke()を呼び出しますか?

public T DoWork<T>(Func<T> method)
{
    return (T)method.Invoke();
}

vs

public T DoWork<T>(Func<T> method)
{
    return (T)method();
}

それとも私は完全に間違った方向に進んでいますか:)ありがとう。


回答:


113

まったく違いはありません。2つ目はInvoke、コンパイラーによって提供される、の省略形です。それらは同じILにコンパイルされます。


1
Invoke()メソッドをオフのままにすると、コンパイラエラーが発生します:「型 'System.Func <T>'を 'T'に暗黙的に変換できません」。私は、.NET 4に対してコンパイルしています
マイク・

2
@Mike:角かっこも外してしまった場合、つまり、(T)methodではなく戻ろうとした場合に発生し(T)method()ます。
Jon Skeet

@JonSkeetので、ここでは、この男の間違っている:social.msdn.microsoft.com/Forums/en-US/...
superlogical

4
@superlogical:ここには2つの問題があります。まず、メソッドを直接呼び出すことと、デリゲートを介して呼び出すことの違いについての質問があります。それは違いと同じではありませんfoo()し、foo.Invoke()どこfooデリゲート型の変数です。もう1つの問題は、答えが話しているように見えることですControl.Invoke。これはInvoke、代理人を呼び出すことと同じではありません。
Jon Skeet

2
@LucaCremonesi:それがメソッド呼び出しの結果である場合、私は一般的にInvokeGetAction()()奇妙に見えるので好きですが、GetAction().Invoke()大丈夫に見えます。しかし、ほとんどの場合、どちらの方法でもかまいません。
Jon Skeet 2017年

17

Invokeは、新しいC#6null伝播演算子でうまく機能します。

T result = method?.Invoke();

の代わりに

T result = method != null ? method() : null;

これが役立つシナリオを説明できますか?教科書事件はイベントを提起しています。
Gusdor 2018

1
たとえば、値が割り当てられていない場合、nullで無視されるdefault(Func)であるオプションのFuncパラメーターを設定できます。
オースティンサルガット

1
これは、イベントやその他のマルチキャストデリゲートの一般的なケースです。通常、これらはnullで初期化され、を呼び出し+=た後にnull以外の値を取得します。したがって、イベントを発生させようとしていて、サブスクリプションがあるかどうかわからない場合、簡潔な解決策はを呼び出すこと?.Invoke(...)です。
ストップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.