質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Delegates

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

3126閲覧

delegate変数とdelegate型の違いを教えてください。

Toto_GG.

総合スコア9

Delegates

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2020/09/28 04:42

編集2020/09/28 08:18

delegateとActionやFuncの違いを理解したいです。

delegateを学び始めたばかりの私からしたら、機能が似すぎていてどう使い分けるのかが分かりません。

〔追記〕

とても勘違いをしていました。
delegateはデリケート型、ActionやFuncはデリゲート変数と書いてあるサイトがあったので、そういうものがあるのかと思い質問しました。
でも、皆さんの回答で理解できました。
ありがとうございます!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/09/28 04:47

変数と型の違いがわからないということですか? int i = 0; この場合、int が型で i が変数です。デリゲートも同じです。
fana

2020/09/28 05:01

> delegateとActionやFuncの違いを理解したいです ActionもFuncもdelegateでは?
退会済みユーザー

退会済みユーザー

2020/09/28 05:27 編集

一応確認しますが、Webでdelegate、Action、Func一通り調べた上での質問でしょうか?いずれも、1-2分と掛からず詳しい解説をしたページがヒットすると思いますが。もしそれでも判らないのであれば、もう少し具体的に何が判らないのか記述してください。
guest

回答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
Zuishin

総合スコア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
ozwk

総合スコア13551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問