構造体/列挙型

スポンサーリンク

未紹介のユーザ定義型である,構造体と列挙型を紹介します。

構造体

構造体 (structure) は,クラス (参照型) を値型に置き換えたデータ型です。

次のプログラムは,長方形を表す Rectangle 構造体を定義した例です。

using System;

struct Rectangle
{
    public int Width { get; set; }
    public int Height { get; set; }

    public Rectangle(int width, int height)
      : this()  // デフォルトコンストラクタを呼び出す
    {
        Width = width; Height = height;
    }

    public int GetArea()
    {
        return Width * Height;
    }
}

class Program
{
    static void Main()
    {
        Rectangle r1 = new Rectangle(3, 4);
        Console.WriteLine(r1.GetArea());  // 出力: 12

        Rectangle r2;   // インスタンス化を暗黙的に行う
        r1.Width = 3; r1.Height = 4;
        Console.WriteLine(r2.GetArea());  // 出力: 12
    }
}

クラスと比較したとき,構造体は主として次の特徴を持ちます。

  • クラスは参照型であり,構造体は値型です。
  • 継承が利用できません。ただし,インタフェースの実装は可能です。
  • ユーザがデフォルトコンストラクタを定義することはできません。
  • 暗黙的に (new 演算子を使わずに) インスタンス化が可能です。
  • インスタンスフィールドは初期化子で初期化できません。

次のプログラムは,参照型/値型の性質の違いを説明するプログラムの例です。

using System;

class Class1 { public int a; }
struct Struct1 { public int a; }

class Program
{
    static void Method1(Class1 c) { ++c.a; }
    static void Method2(Struct1 s) { ++s.a; }

    static void Main()
    {
        Class1 c = new Class1();
        Method1(c);
        Console.WriteLine(c.a);  // 出力: 1

        Struct1 s = new Struct1();
        Method2(s);
        Console.WriteLine(s.a);  // 出力: 0
    }
}

列挙型

列挙型 (enumeration) は整数定数を列挙したもので,複数の選択肢を表すのに使われます。

using System;

enum DayOfWeek
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Satureday,
    Sunday,
}

class Program
{
    static void Main()
    {
        DayOfWeek day = DayOfWeek.Tuesday;
        
        switch (day)
        {
        case DayOfWeek.Sunday:
            Console.WriteLine("It's a holiday.");
            break;
        default:
            Console.WriteLine("It's a weekday.");
            break;
        }
    }
}

列挙体の各メンバには,Weather.Sunny のように 列挙体名.メンバ名 でアクセスします。

列挙体の各メンバ (Monday, Tuesday, ...) には,デフォルトの整数 (0, 1, ...) が付番されます。
割り当てる整数を変更するには,Monday = 1 などと書きます。

スポンサーリンク