.NETのカスタム型(ユーザー定義型)は、開発者がアプリケーションに特定の要件に基づいて型を作成するための強力な手段です。これらの型は、標準のプリミティブ型(整数、文字列、ブール値など)を超えて、アプリケーションのニーズに特化したデータ構造やクラスを作成することを可能にします。この記事では、.NETにおけるカスタム型の種類と、それらをどのように利用するかについて詳しく解説します。
1. クラス(Class)
クラスは、.NETにおける最も基本的で強力なカスタム型の一つです。クラスは、オブジェクト指向プログラミングの基本概念に基づき、状態(フィールド)と振る舞い(メソッド)を持つデータ構造です。クラスを使うことで、複雑なデータ構造を簡単に扱うことができます。

クラスの例
csharppublic class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Introduce()
{
Console.WriteLine($"こんにちは、私は {Name} で、{Age}歳です。");
}
}
この例では、Person
クラスがName
(名前)とAge
(年齢)という2つのプロパティを持ち、Introduce
メソッドでその情報を表示する機能を提供しています。
2. 構造体(Struct)
構造体は、クラスと似ていますが、主に軽量で値型データを扱うために使用されます。構造体は、通常、短期間でメモリ管理を最適化する必要がある場合に使用されます。構造体は値型であるため、クラスとは異なり、変数に格納されるデータそのものがコピーされます。
構造体の例
csharppublic struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Display()
{
Console.WriteLine($"点の座標: ({X}, {Y})");
}
}
この例では、Point
という構造体がX
とY
という座標を持っています。構造体のインスタンスを作成するときは、構造体のコンストラクタを使って値を設定することができます。
3. 列挙型(Enum)
列挙型は、関連する定数を名前付きでグループ化するための型です。列挙型を使用すると、コードの可読性が向上し、定数値を一元的に管理することができます。列挙型は、主に状態や選択肢を表すために使用されます。
列挙型の例
csharppublic enum DayOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
この例では、DayOfWeek
という列挙型を定義し、1週間の曜日を名前付き定数として表現しています。
4. インターフェース(Interface)
インターフェースは、クラスや構造体が実装しなければならないメソッドやプロパティを定義するための契約です。インターフェース自体は実装を持たず、単にメソッドのシグネチャやプロパティを定義します。インターフェースを使用することで、異なるクラス間で共通の契約を強制することができます。
インターフェースの例
csharppublic interface IShape
{
double GetArea();
}
この例では、IShape
というインターフェースを定義しており、このインターフェースを実装するクラスはGetArea
メソッドを実装する必要があります。
5. デリゲート(Delegate)
デリゲートは、メソッドへの参照を格納するオブジェクトであり、他のメソッドを呼び出すために使用されます。デリゲートを使用することで、動的にメソッドを選択して実行することができ、イベント駆動型プログラミングにも重要です。
デリゲートの例
csharppublic delegate void GreetDelegate(string name);
public class Greeter
{
public void Greet(string name)
{
Console.WriteLine($"こんにちは、{name}!");
}
}
この例では、GreetDelegate
というデリゲートを定義し、それを使用してGreeter
クラスのGreet
メソッドを呼び出すことができます。
6. ジェネリック(Generic)
ジェネリックは、型をパラメータ化して、型に依存しないコードを作成するための機能です。ジェネリックを使用することで、異なる型に対して汎用的なコードを再利用することができます。
ジェネリックの例
csharppublic class Box<T>
{
private T item;
public void SetItem(T item)
{
this.item = item;
}
public T GetItem()
{
return item;
}
}
この例では、Box
というジェネリッククラスを定義しており、T
は任意の型を表します。このクラスは、SetItem
メソッドで任意の型の値を設定し、GetItem
メソッドでその値を取得します。
7. タプル(Tuple)
タプルは、複数の異なる型のデータを一つの単位としてまとめるためのデータ構造です。タプルを使用することで、複数の値を簡単に返したり、一時的にまとめて保持したりすることができます。
タプルの例
csharppublic (int, string) GetPerson()
{
return (25, "山田");
}
この例では、GetPerson
メソッドが年齢(整数)と名前(文字列)をタプルとして返します。呼び出し元でタプルの要素を簡単に扱うことができます。
結論
.NETでは、カスタム型を使うことで、アプリケーションのニーズに合わせた柔軟で強力なデータ構造を作成できます。クラス、構造体、列挙型、インターフェース、デリゲート、ジェネリック、タプルなど、さまざまなタイプを活用することで、コードの可読性、再利用性、効率を向上させることができます。これらのカスタム型を適切に活用することで、.NETアプリケーションの開発がより効果的でスケーラブルになります。