回答:
すべてのFuncデリゲートは何かを返します。すべてのアクションデリゲートはvoidを返します。
Func<TResult>
引数を取らず、TResultを返します。
public delegate TResult Func<TResult>()
Action<T>
引数を1つ取り、値を返しません。
public delegate void Action<T>(T obj)
Action
最も単純な「ベア」デリゲートです:
public delegate void Action()
そこにもだFunc<TArg1, TResult>
し、Action<TArg1, TArg2>
(およびその他16個の引数まで)。これらすべて(を除くAction<T>
)は.NET 3.5(System.Coreで定義)の新機能です。
Func<,,, ... ,>
.NET 4.0で最大16個のパラメーター(およびの場合は戻り値の型)に達しましたが、各 "シリーズ"の最後の8つの型は、System.Core.dll
ではなくで定義されてmscorlib.dll
いるため、これが理由ですmichielvooがそれらを見なかった理由。ただし、.NETバージョン4.5および4.5.1では、FuncまたはActionは追加されていません。このシーケンスはA170836またはA170875になりますか?乞うご期待。
すべてのFuncデリゲートは少なくとも1つのパラメーターを取ります
それは真実ではない。それらはすべて少なくとも1つの型引数を取りますが、その引数が戻り型を決定します。
したがってFunc<T>
、パラメーターを受け入れず、値を返します。値を返さない場合は、Action
またはを使用Action<T>
します。
やってみSystem.Func<T>
てSystem.Action
Converter<TInput, TOutput>
ようなデリゲート型がありました(またはありました)Func<T, TResult>
。これは、のList<>.ConvertAll
すべての要素List<>
を別のオブジェクトに投影し、すべての「関数値」を新しいに配置するメソッドで使用されましたList<>
。(後で、Linq Select
をよく使用します。)
場合によっては、イベント処理のデリゲートを作成する必要があります。その場合、から派生する2番目のパラメーターに加えて、System.EvenHandler<T>
型の引数を暗黙的に受け入れることを利用できobject
ますEventArgs
。EventHandlerが返されますvoid
私は個人的に、関数本体で1回限りのコールバックを作成するためのテスト中に、これが便利だと感じました。
...引数を取らず、戻り値の型が無効ですか?
のためSystem.Windows.Forms
に書いているなら、あなたも使うことができます:
public delegate void MethodInvoker()
戻り値と非戻り値のサブルーチンを呼び出す非常に簡単な方法。それぞれFuncとActionを使用しています。(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());
}
}