English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 枠体(Struct)

 C#では、structはデータ構造を表す値型データ型です。パラメータ化の構築関数、静的構築関数、定数、フィールド、メソッド、プロパティ、インデクサ、演算子、イベント、ネストされたタイプを含むことができます。

structは、継承を必要としない小さなデータ値(例えば、座標ポイント、キーワード対、複雑なデータ構造など)を保存するために使用されます。

構造の宣言

structキーワードを使用して構造を宣言します。デフォルトの修飾子は構造体およびメンバーの内部修飾子です。

以下の例では、座標図の構造を宣言しています。

struct Coordinate
{
    public int x;
    public int y;
}

基本型の変数と同様に、new演算子を使用するかどうかに関わらず、structオブジェクトを作成できます。

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point = new Coordinate();
Console.WriteLine(point.x); //出力:0  
Console.WriteLine(point.y); //出力:0

上記の例では、newキーワードを使用してCoordinate(座標)構造体のオブジェクトを作成しています。構造体のデフォルトの無パラメータの構築関数が呼び出され、全てのメンバーが指定されたデータ型のデフォルト値に初期化されます。

newキーワードを使用せずにstruct型の変数を宣言すると、何も構築関数が呼び出されず、全てのメンバーが未割り当ての状態になります。したがって、各メンバーに値を割り当てる前にアクセスする必要があります。それをしないとコンパイル時エラーが発生します。

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point;
Console.Write(point.x); // コンパイル時エラー  
point.x = 10;
point.y = 20;
Console.Write(point.x); //出力:10  
Console.Write(point.y); //出力:20

構造体の構築関数

構造体(struct)には無パラメータの構築関数を含むことができません。パラメータ化の構築関数または静的構築関数のみを含むことができます。

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
Coordinate point = new Coordinate(10, 20);
Console.WriteLine(point.x); //出力:10  
Console.WriteLine(point.y); //出力:20

パラメータ化の構築関数内で全ての構造のメンバーを含め、メンバーに割り当てる必要があります。それ以外の場合、どのメンバーも未割り当ての状態で残っていると、C#コンパイラはコンパイル時エラーを出します。

構造のメソッドとプロパティ

struct(構造)は属性、自動実装の属性、メソッドなどを含むことができます。クラスと同じです。

struct Coordinate
{
    public int x { get; set; }
    public int y { get; set; }
    public void SetOrigin()
    {
        this.x = 0;
        this.y = 0;
    }
}
Coordinate point = Coordinate();
point.SetOrigin();
Console.WriteLine(point.x); //出力:0  
Console.WriteLine(point.y); //出力:0

以下のstructには静的方法が含まれています。

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public static Coordinate GetOrigin()
    {
        return new Coordinate();
    }
}
Coordinate point = Coordinate.GetOrigin();
Console.WriteLine(point.x); //出力:0  
Console.WriteLine(point.y); //出力:0

構造体イベント

構造体は、特定の操作に関する通知をサブスクライバーに提供するイベントを含むことができます。以下の構造体(struct)にはイベントが含まれています。

struct Coordinate
{
    private int _x, _y;
    public int x 
    {
        get{
            return _x;
        }
        set{
            _x = value;
            CoordinatesChanged(_x);
        }
    }
    public int y
    {
        get{
            return _y;
        }
        set{
            _y = value;
            CoordinatesChanged(_y);
        }
    }
    public event Action<int> CoordinatesChanged;
}

上記の構造体にはcoordinateChangedイベントがあり、xまたはy座標が変更された場合にイベントが発生します。以下の例では、CoordinateChangedイベントの処理方法を示します。

class Program
{
    static void Main(string[] args)
    {
        Coordinate point = new Coordinate();
        
        point.CoordinatesChanged += StructEventHandler;
        point.x = 10;
        point.y = 20;
    }
    static void StructEventHandler(int point)
    {
        Console.WriteLine("座標を変更します {0}", point);
    }
}

structは値型であり、そのためクラスオブジェクトよりも速いです。データのみを保存したい場合、structを使用してください。通常、構造体はゲームプログラミングに適しています。しかし、構造体よりもクラスオブジェクトの転送が簡単です。したがって、ネットワークや他のクラスを介してデータを転送する場合、structを使用しないでください。

まとめ

  • structにはコンストラクタ、定数、フィールド、メソッド、プロパティ、インデックス、演算子、イベント、およびネストされたタイプを含むことができます。

  • structには無引数のコンストラクタやデストラクタを含むことができません。

  • structはクラスと同じインターフェースを実現できます。

  • structは他の構造体やクラスを継承することも、クラスの基底クラスとして使用することもできません。

  • structはメンバーを抽象メンバー、密封メンバー、仮想メンバー、または保護メンバーとして指定することができません。