2009-05-27 16 views

答えて

561

すべてのFuncデリゲートが何かを返す。すべてのActionデリゲートはvoidを返します。

Func<TResult>は引数を取らず、TResultを返します。

public delegate TResult Func<TResult>() 

Action<T> 1つの引数を取り、値を返しません:

public delegate void Action<T>(T obj) 

Actionは、最も単純な、 '裸' デリゲートです

public delegate void Action() 

もありますおよびAction<TArg1, TArg2>(および16個までの引数)。これらのすべて(Action<T>を除く)は、.NET 3.5(System.Coreで定義されています)の新機能です。

+8

FYI、次のバージョンの基本クラスライブラリには、4つ以上の仮パラメータをサポートするFuncおよびAction型が含まれます。彼らがどれほど大きなものになるのか正確には思い出せません。 –

+0

私はそれを聞いていない、エリックの頭のおかげで感謝! –

+66

.NET 4.0では、最大8つのパラメータが追加されました。もし彼らがこれを保持すれば、次のバージョンでは11まで上がります!! 11! –

23

System.Func<T>System.Action

+1

でも、私は0引数やその他もろもろは.NET 2.0には存在しないと思います。 – Brian

+1

それは不思議です:Fredは.Net 2.0にはまったく存在しませんが、PredicateとActionはそうです。 –

+2

.NET 2.0ではMethodInvokerデリゲートを使用します。 –

49

をお試しください...は引数を取りませんし、ボイド戻り値の型を持っていますか?

私はActionがこれに対する解決策であると確信しています。

38

のFuncデリゲートのすべてが真実ではない少なくとも一つのパラメータ

を取ります。それらはすべて少なくとも1つの型引数をとりますが、その引数は戻り値の型を決定します。

したがって、Func<T>はパラメータを受け入れずに値を返します。値を返さない場合は、ActionまたはAction<T>を使用します。

0

時折、あなたは暗黙的にEventArgsから派生する必要があり二番目のパラメータに加えて、タイプobjectの引数を受け入れSystem.EvenHandler<T>を利用することができ、その場合、イベント処理のためのデリゲートを、書くことになるでしょう。 EventHandlerが返すvoid

私は個人的には、機能の本体で一回限りのコールバックを作成するためのテストの際に便利です。

-2

非常に簡単な方法で戻り値と戻り値のないサブルーチンを呼び出すことができます。 Funcおよびアクションをそれぞれ使用しています。 (もhttps://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx参照)

using System; 

public class Program 
{ 
    private Func<string,string> FunctionPTR = null; 
    private Func<string,string, string> FunctionPTR1 = null; 
    private Action<object> ProcedurePTR = null; 



    private string Display(string message) 
    { 
     Console.WriteLine(message); 
     return null; 
    } 

    private string Display(string message1,string message2) 
    { 
     Console.WriteLine(message1); 
     Console.WriteLine(message2); 
     return null; 
    } 

    public void ObjectProcess(object param) 
    { 
     if (param == null) 
     { 
      throw new ArgumentNullException("Parameter is null or missing"); 
     } 
     else 
     { 
      Console.WriteLine("Object is valid"); 
     } 
    } 


    public void Main(string[] args) 
    { 
     FunctionPTR = Display; 
     FunctionPTR1= Display; 
     ProcedurePTR = ObjectProcess; 
     FunctionPTR("Welcome to function pointer sample."); 
     FunctionPTR1("Welcome","This is function pointer sample"); 
     ProcedurePTR(new object()); 
    } 
} 
+0

このコードスニペットをお寄せいただき、ありがとうございます。 *なぜ*これが問題の良い解決策であるかを示すことによって[適切な説明は長期的価値を大幅に改善する](// meta.stackexchange.com/q/114762/350567)、将来的にはより有用になる他の同様の質問の読者。あなたの前提を含め、あなたの答えを[編集]して説明を加えてください。 – iBug

0

この例でこれを試してみてください...は引数を取りませんし、ボイド戻り値の型を持っていますか?

あなたがSystem.Windows.Formsのために書いている場合、あなたはまた、使用することができます。

public delegate void MethodInvoker() 
関連する問題