1. ホーム
  2. c#

[解決済み] Func<string,string>とdelegateの違いは何ですか?

2023-03-04 01:31:42

質問

デリゲートには2つの形態がありますね。

A. Func<string, string> convertMethod = lambda 

B. public delegate string convertMethod(string value);

この2つの違いが実際に何なのか不明です。どちらもデリゲートなのでしょうか?最初のものはラムダを使用し、2番目のものは実際に仕事を実行するメソッドを持つ必要があると思います。私も混乱しているかもしれません。

どのように解決するのですか?

まず第一に、あなたの2つの例は2つの全く別のことを行っています。 1 つ目は汎用的なデリゲート変数を宣言してそれに値を代入しており、2 つ目は単に delegate 型を定義しています。 あなたの例は、より完全に、次のようになります。

public static class Program
{
    // you can define your own delegate for a nice meaningful name, but the
    // generic delegates (Func, Action, Predicate) are all defined already
    public delegate string ConvertedMethod(string value);

    public static void Main()
    {
        // both work fine for taking methods, lambdas, etc.
        Func<string, string> convertedMethod = s => s + ", Hello!";
        ConvertedMethod convertedMethod2 = s => s + ", Hello!";
    }
}

しかし、もっと重要なことは、両方の Func<string,string>delegate string convertMethod(string) は、メソッド、匿名メソッド、ラムダ式のいずれであっても、同じメソッド定義を保持することができるようになります。

どちらを使うべきかということについては、状況によります。 もし、デリゲートが何を受け取り、何を返すかによってより定義されることを望むなら、ジェネリックデリゲートが最適です。 もし、デリゲートに何か特別な名前をつけて、そのデリゲートが何をすべきなのかをより明確にしたいのであれば(単純な Action , Predicate など)であれば、独自のデリゲートを作成することは常に選択肢の一つです。