でたらめな概要
Delegate、非常に便利なメソッドの参照を格納できるものですが、
デタラメに使ってしまうと非常にわけのわからない実装になってしまいます。
私も過去に、誰かがDelegateの使い方を誤ったことで
非常に苦しい辛酸舐めさせられるような状況に放り込まれたことがあります。
(Delegateそのものが悪だと言う人も出るほどです。)
当時はDelegateに代入されているメソッドが分からないものかなどと
朧げながらに思っていましたが、
正気な今の状態で調べたらあっけなくわかりそうでした。
でたらめなソースコード
using UnityEngine;
public class DelegateTest : MonoBehaviour
{
TestDelegate testDelegate;
public delegate void TestDelegate();
void Start()
{
// privateなメソッドを代入
testDelegate += Test0;
testDelegate += Test1;
testDelegate += Test2;
testDelegate += Test3;
// 他クラスのメソッドを代入してみる
TestClass testClass = new TestClass();
testDelegate += testClass.TestClassTest0;
testDelegate += testClass.TestClassTest1;
testDelegate += testClass.TestClassTest2;
testDelegate += testClass.TestClassTest3;
// testDelegateに代入されているメソッド名のログを出力
System.Delegate[] invocationList = testDelegate.GetInvocationList();
for (int idx = 0; idx < invocationList.Length; ++idx)
{
Debug.Log($"インスタンスクラス名: {invocationList[idx].Target} メソッド名: {invocationList[idx].Method}");
}
// ついでにそのまま呼んでみる
testDelegate();
}
void Test0()
{
Debug.Log("Test0()");
}
void Test1()
{
Debug.Log("Test1()");
}
void Test2()
{
Debug.Log("Test2()");
}
void Test3()
{
Debug.Log("Test3()");
}
}
class TestClass
{
public void TestClassTest0()
{
Debug.Log("TestClassTest0()");
}
public void TestClassTest1()
{
Debug.Log("TestClassTest1()");
}
public void TestClassTest2()
{
Debug.Log("TestClassTest2()");
}
public void TestClassTest3()
{
Debug.Log("TestClassTest3()");
}
}
でたらめな出力ログ
インスタンスクラス名: DelegateTestPrefab (DelegateTest) メソッド名: Void Test0() インスタンスクラス名: DelegateTestPrefab (DelegateTest) メソッド名: Void Test1() インスタンスクラス名: DelegateTestPrefab (DelegateTest) メソッド名: Void Test2() インスタンスクラス名: DelegateTestPrefab (DelegateTest) メソッド名: Void Test3() インスタンスクラス名: TestClass メソッド名: Void TestClassTest0() インスタンスクラス名: TestClass メソッド名: Void TestClassTest1() インスタンスクラス名: TestClass メソッド名: Void TestClassTest2() インスタンスクラス名: TestClass メソッド名: Void TestClassTest3() Test0() Test1() Test2() Test3() TestClassTest0() TestClassTest1() TestClassTest2() TestClassTest3()
※ インスタンスクラス名 DelegateTestPrefabはシーン内にあるGameObject名です。
参考にさせていただいたサイト様
デリゲートの使用 – C# プログラミング ガイド | Microsoft Docs
コメントを残す