構造体の使用 (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 演算子を使用せずにインスタンス化できます。このような場合、コンストラクターの呼び出しが行われないため、割り当てがより効率的になります。ただし、各フィールドは未割り当てのままになり、すべてのフィールドが初期化されるまではオブジェクトを使用できません。
構造体に参照型がメンバーとして含まれている場合は、メンバーの既定のコンストラクターを明示的に呼び出す必要があります。そうしないと、メンバーは未割り当てのままになり、構造体は使用できません (結果として、コンパイル エラー CS0171 が発生します)。
クラスには継承がありますが、構造体には継承がありません。構造体は、他の構造体やクラスから継承できず、基本クラスになれません。ただし、構造体は、基本クラス Object から継承します。構造体は、クラスの場合とまったく同じ方法でインターフェイスを実装できます。
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:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
Console.Write("CoOrds 2: ");
Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
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:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: CoOrds 1: x = 10, y = 20