delegateとActionやFuncの違いを理解したいです。
delegateを学び始めたばかりの私からしたら、機能が似すぎていてどう使い分けるのかが分かりません。
〔追記〕
とても勘違いをしていました。
delegateはデリケート型、ActionやFuncはデリゲート変数と書いてあるサイトがあったので、そういうものがあるのかと思い質問しました。
でも、皆さんの回答で理解できました。
ありがとうございます!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/28 05:01
退会済みユーザー
2020/09/28 05:27 編集
回答3件
0
ベストアンサー
変数と型について
変数とはオブジェクトにつけられた名前です。たとえば次のコードでは、0 というオブジェクトに i という名前をつけています。これ以降、i は 0 を表します。また変数は入れ物にもたとえられ、「i に 0 を入れる」とも言われます。
int i = 0;
i の前に書かれている int は、i の型を表します。オブジェクトにはそれぞれそのオブジェクトの使用法を示す型(type)があります。int は int 型のことで、int.MinValue から inv.MaxValue までの範囲をとる整数型です。
この例の場合は int 型のオブジェクトを int 型の変数に入れているので、オブジェクトのすべての能力にアクセスできますが、あえてそのオブジェクトの一部の能力のみ使用するよう、別の型の変数に入れることもできます。これを「オブジェクトを別の型にキャストする」と呼びます。
デリゲートについて
デリゲートは関数の一種です。C# の関数には、メソッド、コンストラクタ、プロパティ、ローカル関数などの種類があり、その中にデリゲートも含まれます。
デリゲートの特徴は、他の関数を複数登録して順次呼び出すことができることです。例えば次のコードは "Hello" と "World" を順次表示します。
C#
1Action action1 = () => Console.WriteLine("Hello"); 2Action action2 = () => Console.WriteLine("World"); 3Action action3 = action1 + action2; 4action3();
デリゲート変数について
デリゲート変数はデリゲートが入っている変数です。
デリゲート型について
デリゲート型は型のうち、デリゲートを表すものの総称です。
デリゲート型は、以下のように delegate キーワードを使って宣言し、それに従ってデリゲートを定義し、呼び出します。
C#
1// デリゲート型 IntBinaryOperation の宣言 2delegate int IntBinaryOperation(int a, int b); 3 4static void Main(string[] args) 5{ 6 // デリゲート add の定義 7 IntBinaryOperation add = (a, b) => a + b; 8 9 // デリゲート呼び出し 10 Console.WriteLine(add(2, 3)); 11}
Func, Action について
Func, Action はジェネリックで宣言済みのデリゲート型で、汎用的に使うことができます。
これを使うことにより、その場にふさわしいデリゲート型をわざわざ宣言しなくても、デリゲートを定義することができます。
Func は戻り値のあるデリゲート型で、Action は戻り値の無いデリゲート型です。
たとえば先ほどのように IntBinaryOperation を宣言しなくても、次のように同じことができます。
C#
1static void Main(string[] args) 2{ 3 // デリゲート add の定義 4 Func<int, int, int> add = (a, b) => a + b; 5 6 // デリゲート呼び出し 7 Console.WriteLine(add(2, 3)); 8}
Delegate について
delegate はデリゲートを宣言するのに使用するキーワードでしたが、この頭を大文字にした Delegate は型の名前です。すべてのデリゲートは Delegate 型から派生します。
よって、すべてのデリゲートは Delegate 型にキャストすることができます。
C#
1// デリゲート型 IntBinaryOperation の宣言 2delegate int IntBinaryOperation(int a, int b); 3 4static void Main(string[] args) 5{ 6 // デリゲート add の定義 7 IntBinaryOperation add = (a, b) => a + b; 8 9 // add を Delegate 型にキャストして Delegate 型の変数 add2 に入れる 10 Delegate add2 = add; 11 12 // add2 の呼び出し(Delegate 型にキャストしているのでコンパイルエラーになる) 13 Console.WriteLine(add2(2, 3)); 14 15 // Delegate 型は次のように呼び出す 16 Console.WriteLine(add2.DynamicInvoke(2, 3)); 17}
まとめ
- デリゲートは関数の一種であり、ほかの関数を呼び出すことができる
- デリゲート型はデリゲートの型を示す総称である
- デリゲート変数はデリゲートを入れる変数である
- delegate はデリゲート型を宣言する時に使うキーワードである
- Delegate 型はすべてのデリゲート型の先祖である
- Func, Action はデリゲート型のバリエーションである
投稿2020/09/28 07:56
編集2020/09/28 08:11総合スコア28662
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
delegateとActionやFuncの違い
Action や Func デリゲートを使用すると、delegate キーワードを使ってカスタムデリゲートを明示的に宣言しなくても済むということだと思います。
例えば、以下のコード(古い Microsoft のチュートリアルの一部)で、赤枠で囲った部分で delegate キーワードを使ってカスタムデリゲートを明示的に宣言しています。
青枠で囲ったコードは自分が Action デリゲートを使うために追加したのもです。カスタムデリゲートの明示的な宣言(赤枠部分)をしなくても、同じように DelegateFunction を呼び出すことができます。
どういうときに便利かというと、例えば以下のようなケースでしょうか。わざわざデリゲートを宣言しなくても (Action) を使えば済みます。
ちなみに、Control.Invoke メソッドの引数に直接ラムダ式を代入する(上の画像で (Action) がない)と「ラムダ式はデリゲート型ではないため、'Delegate' 型に変換できません。」というエラーになります。
投稿2020/09/28 06:46
編集2020/09/28 07:04退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
デリゲート:
関数(メソッド)を表す型の総称
Action
, Func<T>
など :
System
名前空間で定義済みのデリゲート
自分でデリゲートを定義するかAction
など定義済みのを使うか :
好み。
「Action
では名前が抽象的すぎて読んでてわからん」というなら自分で具体的な名前で定義すればよいし
「自分で定義するのが面倒」だというなら定義済みデリゲート使えばよい
(普通は定義済みデリゲートを使う気がする)
投稿2020/09/28 05:35
編集2020/09/28 05:48総合スコア13551
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。