【Unity/C#】delegateが全然理解できません。Unity/C#】delegateが全然理解できません。1wakaranasugy【Unity/C#】delegateが全然理解できません。デリゲートの書き方がチンプンカンプンです。メソッドを委譲したい時に使うもの、ということは分かるのですが...ネット上のサンプルコードも幾つか見ましたが、どの部分がデリゲートの核たる部分なのか分かりませんorzデリゲートを使った最も簡単なサンプルコードを、どなたか書いて頂けないでしょうか。【Unity/C#】delegateが全然理解できません。2年前フォーラムルールを一読してやって下さい。各項目に対して答える形で記載して下さい。・どの程度C言語を理解しているか・ライブラリを使っている場合は何を使っている[追記]UnityのVersion,VisualStudioのVersion,どの程度Unity、VisualStudioを理解しているか記述をお願い致します。VisualStudio2017Communityを使用しています。過去ログで何度かdelegateについて答えています。Versionによって書き方が変化して来てdelegate命令が表に出てこない例が多くなりました(C#側で宣言済みのものが多数あります)。いまはラムダ式などに取って代わられているので、.NETFramework2.0,3.0の頃の説明を読むと良くわかるはずです。初歩の例を沢山書いていたたのですが最近引越しの為削除してしました。【Unity/C#】delegateが全然理解できません。特定のメソッドを持つ特定のクラス(あるいはインターフェース)にアップキャスト可能なインスタンスを経由するという方法だけでした。メソッド単体で使うので、状態を持つことができません。状態を扱うには引数でインスタンスを与えるといったオブジェクト指向らしからぬ手段を用いる必要があります。状態を持たせられますが、継承が必須となり、多重継承の問題を抱えることになります。そこで、メソッドのシグネチャのみを対象とし、メソッドが何に属しているかを不問とする方法ができました。それが、一般的にデリゲートと呼ばれる仕組みです。【Unity/C#】delegateが全然理解できません。登場からもう30年近くにもなるのかー。Builderなどで使えたりするぽい。【Unity/C#】delegateが全然理解できません。2年前VisualStudio2017Communityを使用しました。デリゲートmdに格納しました。述語やイベントハンドラ等に利用します。複数のメソッドを同時に参照する事が出来ます。「他のメソッドに処理を丸投げするためのオブジェクト」というような意味です。イベントが起きたときのイベントハンドリングをどのメソッドに丸投げ(委託)するかを指示するためなどに使われます。【Unity/C#】delegateが全然理解できません。【Unity/C#】delegateが全然理解できません。2年前オフトピックオブジェクト指向において、委譲(delegation)は基本的な要素のひとつで、古くからある考え方です。それでも『デリゲート』という単語がメジャーになったのはjavascriptの影響が大きいと思います。javascriptの実装は関数の属するコンテキストが云々といったかなりややこしい話になるけれど、結論だけ見れば「ただの関数に状態を持たせられる」というところが新しい。【Unity/C#】delegateが全然理解できません。2年前C#におけるデリゲート(delegate-委任・委託・委譲という意味)とはその名前の通り、処理の委譲を支援するための仕組みとなります。委譲とは大辞林によると「権限などを他に任せて譲ること」となっています。委譲する場合にはきちんと「委譲することができる人」の「条件の定義」が必要となる訳です。C#においても同じように考えることができて、デリゲートという仕組みでは、まずは処理を委譲することができる関数(メソッド)の条件を定義する必要があります。そこで、C#のデリゲートでは、まずメソッドの参照を行うために利用する条件メソッドの引数や戻り値を定義することで設定します。定義されたデリゲートはC#では「型」(厳密には参照型)として機能します。それでは定義方法です。定義は「delegate」という予約語を用いて「メソッド」の「引数」や「戻り値」などを指定します。前述のとおり、デリゲートは型として定義することになるので、定義したデリゲートを用いることで、メソッドを格納するための「変数宣言」を行うことができる訳ですね。以下のサンプルでは「MyDelegate」という名前のデリゲートを定義しています。ここではintの戻り値を持ち、int型の引数を持つデリゲートはこんな感じで定義します。デリゲート名(パラメータリスト);次に宣言したdelegateを用いて変数宣言を行って、それを利用する訳です。デリゲートで変数宣言した変数には「メソッドそのもの」を代入することが可能です。代入した変数を用いてメソッドを呼び出すことが可能になります。デリゲート名)を省略できるようになりました。method)が追加されていました。インラインメソッドとはdelegate構文を用いて「メソッド名を持たない処理」を記述する方法が提供されました。20));}delegateを用いて非常に簡単は処理を記述することに利用されていましたが、今では後述するラムダ式があるため、利用する機会は減りました。3.5では以下の3種類のデリゲートが定義されました。arg)というような感じで定義されています。arg)のみ定義されていましたが、その後3.0で、上記のように引数の数が4つあるジェネリックデリゲートまで定義されました。4.5ではActionやFuncに指定される引数の数が最大16まであるデリゲートが定義されています。そのため2.0までに行っていたように新しく「delegateキーワードを使ったデリゲート宣言」を行わなくてよくなり、多くのケースで定義済みのデリゲートを利用することで事足りるようになりました。3.0)ラムダ式は簡単に言ってしまうと「デリゲート型」および「式ツリー(ExpressionTree)」を作成するために使用できる匿名関数です。LINQで用いることができるよう追加された仕様ですが、もちろんそれ以外の用途でも利用できます。用いて左辺にパラメータ、右辺に式やステートメントブロックを置くことで作成できます。メソッドと同様return文で戻り値を指定する。result;};上記のようにラムダ式には式形式のものとステートメント形式のものがあります。匿名関数といっても、前述した匿名関数とは見た目以外にもいくつかの違いがあります。•ラムダ式の戻り値はデリゲート以外にも式ツリー(Expressionクラスを用いたツリー)も作成が可能。ラムダ式内でメソッド呼出などを行うと式ツリーの作成ができない。•匿名関数は、インラインで記述できるがメソッドなので、ステートメントブロックの中から定義されているメソッド内の変数にはアクセスできませんが、ラムダ式では「変数のキャプチャ」という機能により下記のサンプルのように上位スコープの変数のアクセスが行える。text);}ただし、上記のサンプルのように変数をキャプチャした状態で外部メソッドをデリゲートを引き継ぐと、通常メソッド終了時に変数の解放がされるところ、生存期間が長くなることがありますので注意が必要です。result;};このようにかなり簡潔に記述できるようになりました。【Unity/C#】delegateが全然理解できません。テンプレートのいずれも、パラメーター化された型のサポートを提供する言語機能です。つにはさまざまな違いがあります。テンプレートのような複雑さがありません。提供されるわけではありません。ジェネリック型の代入は実行時に行われ、その結果、インスタンス化されたオブジェクトのジェネリック型情報が保存されるという点が最も大きな違いです。詳細については、「ランタイムのジェネリック」を参照してください。テンプレートの主な違いを以下に示します。テンプレートほど柔軟ではありません。クラスでは、ユーザー定義演算子は呼び出すことができますが、算術演算子を呼び出すことはできません。パラメーターを使用できません。