概要
DelegateCommand
の引数として使用するAction
についてよくわかっていなかったため、掘り下げようと思ったが、関係する大元のDelegate
があまりにも多岐にわたりすぎていてとりあえず以下の3つの動きを確認したときの備忘録です。
- Delgateクラス
- Acitonデリゲート
- Funcデリゲート
Delegate
デリゲートを表します。デリゲートとは、静的メソッドを参照するデータ構造、またはクラス インスタンスおよびクラスのインスタンス メソッドを参照するデータ構造です。
Delegateクラスの派生としてAction、Funcそれぞれのデリゲートが存在する
まずDelegateクラス
があって、その派生にDelegate
から派生したActionデリゲート
、Funcデリゲート
がある。
この名前から想定されるようにActionとFuncの違いはTResult
の有無であり、以下のように使い分ける
デリゲート | 用途 |
---|---|
Action | UIの操作(アクション) |
Func | コールバックなどの関数 |
以下略以降、T1~T16の最大16個の引数を受け取れるデリゲートが定義されている
- Delegate
- Action
- Action<T>,
- Action<T1, T2>
- 以下略
- Func<TResut>
- Func<T1, TResult>
- 以下略
Actionデリゲート
値を返さないメソッド
をカプセル化します。
Funcデリゲート
TResult パラメーターで指定された型の値を返すメソッド
をカプセル化します。
試したコード
class Program
{
static void Main(string[] args)
{
Console.WriteLine("----- Main - Start -----");
DelegateTarget((string msg) => Console.WriteLine($"{msg} Callback"));
ActionTarget((string msg) => Console.WriteLine($"{msg} Callback"));
FuncTarget((string msg) => {
Console.WriteLine($"{msg} Callback");
return true;
});
Console.WriteLine("----- Main - End -----");
}
delegate void Callback(string message);
static void DelegateTarget(Callback callback)
{
Console.WriteLine("***** Delegate - Start *****");
callback("Delegate");
Console.WriteLine("***** Delegate - End *****");
}
// 戻り値の設定はできない
static void ActionTarget(Action<string> action)
{
Console.WriteLine("***** Action - Start *****");
action("Action");
Console.WriteLine("***** Action - End *****");
}
// 戻りの型引数は必須
static void FuncTarget(Func<string, bool> func)
{
Console.WriteLine("***** Func - Start *****");
func("Func");
Console.WriteLine("***** func - End *****");
}
}
結果
PS> dotnet run
----- Main - Start -----
***** Delegate - Start *****
Delegate Callback
***** Delegate - End *****
***** Action - Start *****
Action Callback
***** Action - End *****
***** Func - Start *****
Func Callback
***** func - End *****
----- Main - End -----