📖

C#基本まとめ~列挙型・構造体・クラス編~

2022/12/11に公開

列挙型(enum)

列挙型は主に特定の値を指定して処理を分岐したり、引数の値を明確したりする場合に使用します。
型の宣言にはenumを使用し、格納できるのは整数(byte,sbyte,short,ushort,int,uint,long,ulong)のみで既定の型はintです。
メンバに値を指定しない場合、0から順にインクリメントされて設定されます。
列挙型で宣言した変数へは通常 列挙型.メンバ を使用しますが、宣言した型の値なら直接セットすることも可能です。この場合、メンバに保有していない値でも格納できてしまうことに注意してください。

// 列挙型の宣言
enum DayOfTheWeek
{
    Sunday
  , Monday
  , Tuesday
  , Wednesday
  , Thursday
  , Friday
  , Saturday
}

// 列挙型の使用
DayOfTheWeek youbi;
// 設定
youbi = DayOfTheWeek.Monday;

// キャストすれば範囲外の値も格納できてしまう
youbi = (DayOfTheWeek)8;

構造体

構造体はメンバ変数やプロパティ、メソッドを持つ値型の定義です。
宣言にはstructを使用します。

// 構造体の宣言
private struct Data
{
    public int Value { get; set; }

    public void Work()
    {
        // 処理
    }

    public bool IsValue()
    {
        return this.Value >= 1;
    }
}

// 構造体の使用
Data wk = new Data();
wk.Value = 1;
wk.Work();
var ret = wk.IsValue();

クラス

クラスはメンバ変数やプロパティ、メソッドを持つ参照型の定義です。
宣言にはclassを使用します。

// クラスの宣言
private class Data
{
    public int Value { get; set; }

    public void Work()
    {
        // 処理
    }

    public bool IsValue()
    {
        return this.Value >= 1;
    }
}

// クラスの使用
Data wk = new Data();
wk.Value = 1;
wk.Work();
var ret = wk.IsValue();

クラスと構造体の違い

クラスと構造体の違いは先に書いたように、参照型か値型かの違いになります。また、クラスは使用時にnewステートメントでインスタンスを作る必要がありますが、構造体ではnewステートメントは無くても使用できます(ただしVB.Netとちがい明示的にフィールドを初期化する必要があったり勝手が違いますので構造体もnewするのが良いかと)。

クラスと構造体の使い分け

構造体とクラスはどちらも同様の使い方が出来ます。
構造体は値型の為、インスタンスのサイズが大きいとインスタンスの代入や値渡し、メソッドの戻り値等で使用するとデータをコピーする作業に時間がかかります。その為、基本的にはクラスを用い、インスタンスサイズが小さく処理速度の改善が求められる場合に構造体を用いるように使い分けると良いかと思います。

Microsoft Docsにて指標が出ておりますが、この指標に沿うとほぼ構造体の出番がなくなります。ですが、標準機能でもこの指標に沿っていないものも多々あり、レスポンスを重視するシステムでは、最終的にはベンチマークをとってどちらの方が良いか決めていくようにしてください。

Discussion