Unity_Lesson

Generics(ジェネリクス)は、C#を含む多くのプログラミング言語における機能で、データ型をパラメータとして持つクラス、メソッド、インターフェースを定義するための機構です。これにより、コードの再利用性を高め、型安全性を確保し、パフォーマンスを向上させることができます。

Genericsの主な特徴

  1. 型安全性: Genericsを使用することで、型の不一致によるエラーをコンパイル時に検出できるため、ランタイムエラーを減らすことができます。

  2. 再利用性: 同じコードを異なるデータ型で再利用できるため、冗長なコードを書く必要がなくなります。

  3. パフォーマンス向上: ジェネリックを使用すると、型キャストの必要がなくなり、ボックス化(値型をオブジェクト型に変換すること)を避けることができるため、パフォーマンスが向上します。

Genericsの基本的な使い方

ジェネリッククラスの例

以下は、ジェネリッククラスの簡単な例です。このクラスは、任意のデータ型の値を保持します。

public class GenericContainer<T>
{
    private T value;

    public GenericContainer(T value)
    {
        this.value = value;
    }

    public T GetValue()
    {
        return value;
    }

    public void SetValue(T value)
    {
        this.value = value;
    }
}

// 使用例
class Program
{
    static void Main()
    {
        // 整数を保持するGenericContainer
        GenericContainer<int> intContainer = new GenericContainer<int>(42);
        Console.WriteLine("Int Value: " + intContainer.GetValue());

        // 文字列を保持するGenericContainer
        GenericContainer<string> stringContainer = new GenericContainer<string>("Hello, Generics!");
        Console.WriteLine("String Value: " + stringContainer.GetValue());
    }
}

ジェネリックメソッドの例

以下は、ジェネリックメソッドの例です。このメソッドは、任意のデータ型の配列から最大値を返します。

public class GenericMethods
{
    public T GetMax<T>(T[] items) where T : IComparable<T>
    {
        T max = items[0];
        foreach (var item in items)
        {
            if (item.CompareTo(max) > 0)
            {
                max = item;
            }
        }
        return max;
    }
}

// 使用例
class Program
{
    static void Main()
    {
        GenericMethods genericMethods = new GenericMethods();

        int[] intArray = { 1, 3, 5, 7, 9 };
        Console.WriteLine("Max Int: " + genericMethods.GetMax(intArray));

        string[] stringArray = { "apple", "banana", "cherry" };
        Console.WriteLine("Max String: " + genericMethods.GetMax(stringArray));
    }
}

UnityでのGenericsの使用例

UnityでもGenericsはよく使用されます。例えば、カスタムコレクションやコンポーネントの管理に利用できます。

以下は、Unityでのジェネリックリストを作成する例です。

using System.Collections.Generic;
using UnityEngine;

public class GenericListExample : MonoBehaviour
{
    private List<GameObject> gameObjects;

    void Start()
    {
        gameObjects = new List<GameObject>();

        // ゲームオブジェクトを追加
        gameObjects.Add(new GameObject("Object1"));
        gameObjects.Add(new GameObject("Object2"));
        
        // ゲームオブジェクトを表示
        foreach (var obj in gameObjects)
        {
            Debug.Log("Game Object: " + obj.name);
        }
    }
}

まとめ