デリゲートを手動で作成する vs Action/Func デリゲートを使用する 質問する

デリゲートを手動で作成する vs Action/Func デリゲートを使用する 質問する

今日、私はこれを宣言しようと思っていました:

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カスタム デリゲートはあまり使用されなくなりましたが、それでもまだ使用されています。カスタム デリゲートの利点は次のとおりです。

  1. 他の人が指摘しているように、一般的な表現Actionとは異なり、意図を明確に伝えますFuncパトリック意味のあるパラメータ名について非常に良い指摘をしています。

  2. ref他の2つの汎用デリゲートとは異なり、 /パラメータを指定できますout。例えば、

    public delegate double ChangeListAction(out string p1, ref int p2);
    

    だがしかし

    Func<out string, ref int, double> ChangeListAction;
    
  3. ChangeListActionまた、カスタム デリゲートを使用する場合は、コード ベースのどこかに 1 回だけ記述 (つまり定義)する必要がありますが、定義しない場合は、あらゆる場所に記述する必要Func<string, int, double>があります。後者の場合、シグネチャを変更するのは面倒です。これは、dry ではないことの悪い例です。

  4. オプションのパラメータを持つことができます。

    public delegate double ChangeListAction(string p1 = "haha", int p2);
    

    だがしかし

    Func<string, int, double> ChangeListAction = (p1 = "haha", p2) => (double)p2; 
    
  5. paramsメソッドのパラメータにはキーワードを使用できますが、 ではそうではありませんAction/Func

    public delegate double ChangeListAction(int p1, params string[] p2);
    

    だがしかし

    Func<int, params string[], double> ChangeListAction;
    
  6. まあ、本当に運が悪く、16 を超えるパラメータが必要な場合 (現時点では) :)


Actionおよびの利点についてFunc:

  1. これは手っ取り早くて汚い方法なので、私はあらゆるところで使っています。ユースケースが些細なものであれば、コードが短くなります (カスタム デリゲートは私にとって時代遅れです)。

  2. さらに重要なのは、ドメイン間で型の互換性があることです。Actionと はFuncフレームワークで定義されており、パラメータの型が一致する限りシームレスに動作します。ChangeSomeActionを にすることはできませんChangeListActionLinqは、この側面を大いに活用しています。

おすすめ記事