ヘッダー
C# サンプル集
 

列挙型の宣言

2021/3/14

→ Visual Basic のサンプルに切り替える

列挙型のことを列挙体と表現する場合もあります。

 

一般的な列挙型の宣言

public enum BloodType
{
    A,
    B,
    AB,
    O
}

使用例

BloodType userBloodType;
userBloodType = BloodType.A;

 

 

列挙型の各値にXMLコメントを設定するとわかりやすいのでお勧めです。

public enum ShapeType
{
    /// <summary>正方形・長方形</summary>
    Rect,
    /// <summary>円・楕円</summary>
    Oval,
    /// <summary>Rect以外のすべての多角形</summary>
    Polygon,
    /// <summary>直線</summary>
    Line,
    /// <summary>曲線</summary>
    Curve
}

 

 

値を指定した列挙型の宣言

public enum Appearance
{
    None = 0,
    Fill = 1,
    Border = 2,
    Text = 4,
    Shadow = 8
}

 

 

値を組み合わせて使う列挙型の宣言

[Flags]
public enum Appearance
{
    None = 0,
    Fill = 1,
    Border = 2,
    Text = 4,
    Shadow = 8
}

メモ:値を組み合わせて使用する列挙型の各値は0からはじめ、後は1,2,4,8,16,32など 2 の n乗 にするのが無難です。

メモ:値を組み合わせて使用する列挙型の場合、名前は Appearances のように複数形にすることが多いようです。

値を組み合わせて使用する例

Appearance drawType = Appearance.Border | Appearance.Text;

//if ((drawType & Appearance.Text) == Appearance.Text) //← .NET Framework 3.5(2008年頃)以前の場合
if (drawType.HasFlag(Appearance.Text)) //← .NET Framework 4以降の場合
{
    System.Diagnostics.Debug.WriteLine("Text を含んでいます。");
}

System.Diagnostics.Debug.WriteLine(drawType.ToString());

Debug.WriteLineが表示される場所

この例を実行すると次のように表示されます。

Text を含んでいます。
Border, Text

Flags属性がなくてもこのプログラムは実行可能ですが、結果は次の通りになります。

Text を含んでいます。
6

 

 

型を指定した列挙型の宣言

public enum Appearance : short
{
    None = 0,
    Fill = 1,
    Border = 2,
    Text = 4,
    Shadow = 8
}

メモ:指定できるデータ型は byte, int, long, sbyte, short, uint, ulong, ushort のどれかです。型を指定しなかった場合は int になります。

 

 

参考:文字列型の列挙型のようなもの

文字列型など数値以外の型の列挙型は定義できません。似たようなものを実現するには通常の定数を利用するなどします。

public struct Nation
{
    /// <summary>日本国内を対象とする場合</summary>
    public const string Japan = "日本";

    /// <summary>中国本土を対象とする場合</summary>
    public const string China = "中華人民共和国";

    /// <summary>アメリカ合衆国。プエルトリコ等海外領土を含まない範囲。</summary>
    public const string USA = "アメリカ合衆国";

    /// <summary>ロシア連邦を構成するすべての国家</summary>
    public const string Russia = "ロシア連邦";
}

使用例

string target = Nation.USA;
System.Diagnostics.Debug.WriteLine(target);

アメリカ合衆国 と出力されます。 → Debug.WriteLineが表示される場所

 

専用の型として定義することもできます。複雑になる割には見返りが少なくお勧めではありません。

/// <completionlist cref="Nation"/>
public struct Nation
{
    /// <summary>日本国内を対象とする場合</summary>
    public static Nation Japan {get; set;} = new Nation("日本");

    /// <summary>中国本土を対象とする場合</summary>
    public static Nation China {get; set;} = new Nation("中華人民共和国");

    /// <summary>アメリカ合衆国。プエルトリコ等海外領土を含まない範囲。</summary>
    public static Nation USA {get; set;} =new Nation("アメリカ合衆国");

    /// <summary>ロシア連邦を構成するすべての国家</summary>
    public static Nation Russia {get; set;} = new Nation("ロシア連邦");

    private string rawValue;

    public Nation(string rawValue)
    {
        this.rawValue = rawValue;
    }

    public static implicit operator string(Nation value)
    {
        return value.rawValue;
    }

    public static implicit operator Nation(string value)
    {
        return new Nation(value);
    }
}

使用例

Nation target = Nation.USA;
string nationName = target;
System.Diagnostics.Debug.WriteLine(nationName);

アメリカ合衆国 と出力されます。 → Debug.WriteLineが表示される場所

 

 

参考

列挙型 - C# リファレンス | Microsoft Docs