構造体の使用 (C# プログラミング ガイド)
更新 : 2008 年 7 月
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 から継承します。構造体は、クラスの場合とまったく同じ方法でインターフェイスを実装できます。
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:
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
参照
概念
参照
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2008 年 7 月 |
CS0171 に関する段落を追加 |
コンテンツ バグ修正 |