構造体/列挙型
スポンサーリンク
未紹介のユーザ定義型である,構造体と列挙型を紹介します。
構造体
構造体 (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 などと書きます。
スポンサーリンク