今日、私はこれを宣言しようと思っていました:
private delegate double ChangeListAction(string param1, int number);
しかし、これを使わないのはなぜでしょうか:
private Func<string, int, double> ChangeListAction;
または、ChangeListAction
戻り値がない場合は、次のように使用できます。
private Action<string,int> ChangeListAction;
では、キーワードを使用してデリゲートを宣言する利点はどこにあるのでしょうかdelegate
?
それは .NET 1.1 のせいでしょうか、そして .NET 2.0 が登場しAction<T>
、そして .NET 3.5 が登場したのでしょうかFunc<T>
?
ベストアンサー1
Action
デリゲートの登場により、Func
カスタム デリゲートはあまり使用されなくなりましたが、それでもまだ使用されています。カスタム デリゲートの利点は次のとおりです。
他の人が指摘しているように、一般的な表現
Action
とは異なり、意図を明確に伝えますFunc
。パトリック意味のあるパラメータ名について非常に良い指摘をしています。ref
他の2つの汎用デリゲートとは異なり、 /パラメータを指定できますout
。例えば、public delegate double ChangeListAction(out string p1, ref int p2);
だがしかし
Func<out string, ref int, double> ChangeListAction;
ChangeListAction
また、カスタム デリゲートを使用する場合は、コード ベースのどこかに 1 回だけ記述 (つまり定義)する必要がありますが、定義しない場合は、あらゆる場所に記述する必要Func<string, int, double>
があります。後者の場合、シグネチャを変更するのは面倒です。これは、dry ではないことの悪い例です。オプションのパラメータを持つことができます。
public delegate double ChangeListAction(string p1 = "haha", int p2);
だがしかし
Func<string, int, double> ChangeListAction = (p1 = "haha", p2) => (double)p2;
params
メソッドのパラメータにはキーワードを使用できますが、 ではそうではありませんAction/Func
。public delegate double ChangeListAction(int p1, params string[] p2);
だがしかし
Func<int, params string[], double> ChangeListAction;
まあ、本当に運が悪く、16 を超えるパラメータが必要な場合 (現時点では) :)
Action
およびの利点についてFunc
:
これは手っ取り早くて汚い方法なので、私はあらゆるところで使っています。ユースケースが些細なものであれば、コードが短くなります (カスタム デリゲートは私にとって時代遅れです)。
さらに重要なのは、ドメイン間で型の互換性があることです。
Action
と はFunc
フレームワークで定義されており、パラメータの型が一致する限りシームレスに動作します。ChangeSomeAction
を にすることはできませんChangeListAction
。Linq
は、この側面を大いに活用しています。