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