構造体の使用 (C# プログラミング ガイド)Using Structs (C# Programming Guide)

struct 型は、 PointRectangleColorなどの軽量のオブジェクトを表すのに適しています。The struct type is suitable for representing lightweight objects such as Point, Rectangle, and Color. 点を表すには 自動実装プロパティ がある クラスを使用するのと同じくらい便利ですが、シナリオによっては 構造体 を使用する方がより効率的です。Although it is just as convenient to represent a point as a class with Auto-Implemented Properties, a struct might be more efficient in some scenarios. たとえば、1,000 個の Point オブジェクトから成る配列を宣言する場合は、各オブジェクトの参照用に追加のメモリを割り当てます。この場合、構造体であれば処理上の負荷を抑えることができます。For example, if you declare an array of 1000 Point objects, you will allocate additional memory for referencing each object; in this case, a struct would be less expensive. .NET Framework には Point という名前のオブジェクトが含まれているため、この例の構造体には代わりに "Coords" という名前が付けられています。Because the .NET Framework contains an object called Point, the struct in this example is named "Coords" instead.

public struct Coords
{
    public int x, y;

    public Coords(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

構造体に既定の (パラメーターなしの) コンストラクターを定義するとエラーになります。It is an error to define a default (parameterless) constructor for a struct. また、構造体の本体のインスタンス フィールドを初期化した場合もエラーになります。It is also an error to initialize an instance field in a struct body. 外部アクセス可能な構造体メンバーを初期化するには、パラメーター化されたコンストラクター、暗黙的なパラメーターなしのコンストラクター、オブジェクト初期化子を使用するか、構造体を宣言した後で個別にメンバーにアクセスする必要があります。You can initialize externally accessible struct members only by using a parameterized constructor, the implicit, parameterless constructor, an object initializer, or by accessing the members individually after the struct is declared. プライベートかそれ以外の理由でアクセスできないメンバーの場合、コンストラクターを独占的に使用する必要があります。Any private or otherwise inaccessible members require the use of constructors exclusively.

new 演算子を使用して struct オブジェクトを作成すると、コンストラクター シグネチャに基づき、オブジェクトが作成されて適切なコンストラクターが呼び出されます。When you create a struct object using the new operator, it gets created and the appropriate constructor is called according to the constructor's signature. クラスとは異なり、構造体は new 演算子を使用せずにインスタンス化できます。Unlike classes, structs can be instantiated without using the new operator. このような場合、コンストラクターの呼び出しが行われないため、割り当てがより効率的になります。In such a case, there is no constructor call, which makes the allocation more efficient. ただし、各フィールドは未割り当てのままになり、すべてのフィールドが初期化されるまではオブジェクトを使用できません。However, the fields will remain unassigned and the object cannot be used until all of the fields are initialized. たとえば、プロパティから値を取得または設定することができません。This includes the inability to get or set values through properties.

既定の、パラメーターのないコンストラクターを利用して構造体オブジェクトを初期化する場合、その既定値に基づいてすべてのメンバーが割り当てられます。If you instantiate a struct object using the default, parameterless constructor, all members are assigned according to their default values.

構造体のパラメーターを使用してコンストラクターを記述するとき、すべてのメンバーを明示的に初期化する必要があります。それをしない場合、1 つまたは複数のメンバーが未割り当てのままとなり、構造体を使用できず、コンパイラ エラー CS0171 が出ます。When writing a constructor with parameters for a struct, you must explicitly initialize all members; otherwise one or more members remain unassigned and the struct cannot be used, producing compiler error CS0171.

クラスには継承がありますが、構造体には継承がありません。There is no inheritance for structs as there is for classes. 構造体は、他の構造体やクラスから継承できず、基本クラスになることはできません。A struct cannot inherit from another struct or class, and it cannot be the base of a class. ただし、構造体は、基本クラス Objectから継承します。Structs, however, inherit from the base class Object. 構造体は、クラスの場合とまったく同じ方法でインターフェイスを実装できます。A struct can implement interfaces, and it does that exactly as classes do.

structキーワードを使用してクラスを宣言することはできません。You cannot declare a class using the keyword struct. C# では、クラスと構造体は、意味が異なります。In C#, classes and structs are semantically different. 構造体は値型ですが、クラスは参照型です。A struct is a value type, while a class is a reference type. 詳細については、「 Value Types (値型)」を参照してください。For more information, see Value Types.

参照型の機能が必要な場合以外は、小さいクラスを構造体として宣言した方が、システムによってより効率的に処理される可能性があります。Unless you need reference-type semantics, a small class may be more efficiently handled by the system if you declare it as a struct instead.

例 1Example 1

説明Description

既定のコンストラクターとパラメーター化されたコンストラクターの両方を使用した struct の初期化の例を次に示します。This example demonstrates struct initialization using both default and parameterized constructors.

コードCode

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
*/

例 2Example 2

説明Description

構造体に固有の機能を次の例に示します。This example demonstrates a feature that is unique to structs. この例では、new 演算子を使用せずに Coords オブジェクトを作成しています。It creates a Coords object without using the new operator. structclassという単語に置き換えた場合、プログラムはコンパイルされません。If you replace the word struct with the word class, the program will not compile.

コードCode

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

関連項目See also