構造体の使用 (C# プログラミング ガイド)
struct 型は、Point、Rectangle、Color などの軽量のオブジェクトを表すのに適しています。点はクラスで表現できますが、一部の事例では構造体の方がより効果的です。たとえば、1,000 個の Point オブジェクトから成る配列を宣言する場合は、各オブジェクトの参照用に新たにメモリが割り当てられます。この場合、構造体であれば処理上の負荷を抑えることができます。.NET Framework には Point というオブジェクトが含まれているため、ここで使用する構造体は "CoOrds" と呼ぶことにします。
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
構造体に対して既定の (パラメータなしの) コンストラクタを宣言するとエラーになります。構造体メンバを既定値に初期化する既定のコンストラクタが常備されています。また、構造体のインスタンス フィールドを初期化するとエラーになります。
new 演算子を使用して struct オブジェクトを作成すると、オブジェクトが作成されて適切なコンストラクタが呼び出されます。クラスとは異なり、構造体は new 演算子を使用せずにインスタンス化できます。new を使用しなかった場合、各フィールドは未割り当てのままになり、すべてのフィールドが初期化されるまでオブジェクトを使用できません。
クラスには継承がありますが、構造体には継承がありません。構造体は、他の構造体やクラスから継承できず、基本クラスになれません。ただし、構造体は、基本クラス Object から継承します。構造体は、クラスの場合とまったく同じ方法でインターフェイスを実装できます。
C++ とは異なり、キーワード struct を使用してクラスを宣言できません。C# では、クラスと構造体は、意味が異なります。構造体は値型ですが、クラスは参照型です。詳細については、「値型 (C# リファレンス)」を参照してください。
参照型の機能が必要な場合以外は、小さいクラスの方が、構造体としてより効果的に処理されることがあります。
例 1
既定のコンストラクタとパラメータ化されたコンストラクタの両方を使用した struct の初期化の例を次に示します。
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare and initialize struct objects.
class TestCoOrds
{
static void Main()
{
// Initialize:
CoOrds coords1 = new CoOrds();
CoOrds coords2 = new CoOrds(10, 10);
// Display results:
System.Console.Write("CoOrds 1: ");
System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
System.Console.Write("CoOrds 2: ");
System.Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
}
}
出力
CoOrds 1: x = 0, y = 0
CoOrds 2: x = 10, y = 10
例 2
struct 固有の機能を次の例に示します。new 演算子を使用せずに CoOrds オブジェクトが作成されます。struct を class という単語に置き換えた場合、プログラムはコンパイルされません。
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
static void Main()
{
// Declare an object:
CoOrds coords1;
// Initialize:
coords1.x = 10;
coords1.y = 20;
// Display results:
System.Console.Write("CoOrds 1: ");
System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
}
}
出力
CoOrds 1: x = 10, y = 20
参照
関連項目
オブジェクト、クラス、および構造体 (C# プログラミング ガイド)