メインコンテンツまでスキップ

デリゲート

デリゲートは、C#における重要な概念で、メソッドの参照を格納できる型です。デリゲートを使用すると、メソッドを引数として渡したり、特定のメソッドをコールバックとして呼び出したりすることができます。これにより、イベント処理やコールバックの実装が容易になります。

デリゲートの主な特徴

  1. メソッドの参照: デリゲートは、特定のメソッドのシグネチャと一致するメソッドの参照を保持します。このため、異なるメソッドを同じデリゲート型で扱うことができます。

  2. 型安全: デリゲートは型安全です。つまり、デリゲートが保持できるメソッドのシグネチャが一致しない場合、コンパイル時にエラーが発生します。

  3. マルチキャスト: デリゲートは、複数のメソッドを呼び出すことができるマルチキャストデリゲートとしても使用できます。これにより、複数のメソッドを一度に呼び出すことができます。

デリゲートの定義と使用方法

デリゲートの定義

以下は、Action型のデリゲートを使用して、引数なしで戻り値なしのメソッドを参照するデリゲートを定義する例です。

public delegate void MyDelegate();

デリゲートの使用

デリゲートを使ってメソッドを呼び出す例を示します。

using System;

public class DelegateExample
{
public static void Main()
{
MyDelegate myDelegate = new MyDelegate(MethodA);
myDelegate += MethodB; // メソッドを追加

myDelegate(); // MethodA と MethodB が呼び出される
}

public static void MethodA()
{
Console.WriteLine("Method A called");
}

public static void MethodB()
{
Console.WriteLine("Method B called");
}
}

デリゲートの引数を持つ例

引数を持つデリゲートの例を示します。

public delegate void MyDelegateWithArgs(string message);

public class DelegateWithArgsExample
{
public static void Main()
{
MyDelegateWithArgs myDelegate = new MyDelegateWithArgs(MethodWithArgs);
myDelegate("Hello, Delegate!"); // メッセージを引数として渡す
}

public static void MethodWithArgs(string message)
{
Console.WriteLine(message);
}
}

Unityにおけるデリゲートの使用

Unityでは、デリゲートはイベントやコールバックを実装する際に非常に便利です。以下は、Unityでのデリゲートの使用例です。

Unityでのデリゲートの例

using UnityEngine;

public class DelegateExample : MonoBehaviour
{
// デリゲートの定義
public delegate void GameEvent();

// イベント
public event GameEvent OnGameStart;

void Start()
{
// イベントにメソッドを追加
OnGameStart += StartGame;

// イベントを呼び出す
OnGameStart?.Invoke(); // nullチェックを行い、メソッドが登録されている場合にのみ呼び出す
}

void StartGame()
{
Debug.Log("Game Started!");
}
}

まとめ

  • デリゲートは、メソッドの参照を格納できる型で、メソッドを引数として渡すことができる。
  • 型安全であり、コンパイル時にシグネチャが一致しない場合はエラーとなる。
  • マルチキャストデリゲートを使用して、複数のメソッドを一度に呼び出すことができる。
  • Unityでは、イベントやコールバックの実装にデリゲートが非常に便利です。

デリゲートを使用することで、柔軟で再利用性の高いコードを実装することが可能になります。