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

Generics

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);
}
}
}

まとめ

  • Genericsは、型安全で再利用可能なコードを書くための強力な機能です。
  • 型安全性を確保し、再利用性パフォーマンスを向上させることができます。
  • ジェネリッククラスやメソッドを使用して、異なるデータ型で同じロジックを適用できます。
  • Unityでも利用されることが多く、特にデータ管理やカスタムコレクションの実装に便利です。