PR

【C#入門】列挙型(Enum)を使用してみよう!

はじめに

列挙型(Enum)は、関連する定数をグループ化し、コードの可読性と保守性を向上させるために使用されます。C#における列挙型の基本的な使い方から応用例までを解説します。列挙型を理解することで、コードの品質を向上させ、バグを減らすことができます。これから一緒に列挙型の基本を学び、実際に使用する方法を見ていきましょう。

列挙型の基本

列挙型の宣言

列挙型を宣言するには、enumキーワードを使用します。以下は、曜日を表す列挙型の例です。

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

この例では、DayOfWeekという名前の列挙型を宣言し、各曜日を列挙子として定義しています。

列挙型の使用

列挙型を使用するには、変数を列挙型として宣言し、列挙子を割り当てます。

class Program
{
    static void Main(string[] args)
    {
        DayOfWeek today = DayOfWeek.Monday;
        Console.WriteLine($"Today is {today}");
    }
}

この例では、todayという変数をDayOfWeek型として宣言し、Mondayを割り当てています。出力結果は「Today is Monday」となります。

列挙型の応用

列挙型の数値

列挙型の各列挙子にはデフォルトで整数値が割り当てられます。最初の列挙子には0が割り当てられ、それ以降は1ずつ増加します。列挙子に特定の値を割り当てることもできます。

enum DayOfWeek
{
    Sunday = 1,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

この例では、Sundayが1に設定されており、Monday以降は自動的に増加します。

class Program
{
    static void Main(string[] args)
    {
        DayOfWeek today = DayOfWeek.Monday;
        Console.WriteLine($"Today is {(int)today}");
    }
}

このコードは「Today is 2」と出力します。(int)キャストを使用して列挙子の数値を取得しています。

フラグ列挙型

フラグ列挙型は、ビットフィールドを使用して複数の値を組み合わせることができます。フラグ列挙型を定義するには、[Flags]属性を使用します。

[Flags]
enum FileAccess
{
    Read = 1,
    Write = 2,
    Execute = 4
}

フラグ列挙型を使用することで、複数の値を組み合わせることができます。

class Program
{
    static void Main(string[] args)
    {
        FileAccess access = FileAccess.Read | FileAccess.Write;
        Console.WriteLine($"Access: {access}");

        if ((access & FileAccess.Read) == FileAccess.Read)
        {
            Console.WriteLine("Read access is granted.");
        }
        if ((access & FileAccess.Write) == FileAccess.Write)
        {
            Console.WriteLine("Write access is granted.");
        }
    }
}

この例では、「Access: Read, Write」と表示され、「Read access is granted.」および「Write access is granted.」が出力されます。

列挙型のメソッド

列挙型には、文字列に変換するためのToStringメソッドや、文字列から列挙型に変換するためのEnum.Parseメソッドがあります。

class Program
{
    static void Main(string[] args)
    {
        DayOfWeek today = DayOfWeek.Monday;
        string todayStr = today.ToString();
        Console.WriteLine($"Today is {todayStr}");

        DayOfWeek parsedDay = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Friday");
        Console.WriteLine($"Parsed day is {parsedDay}");
    }
}

このコードでは、「Today is Monday」と「Parsed day is Friday」が出力されます。

列挙型のループ

列挙型の値をループ処理する場合、Enum.GetValuesメソッドを使用します。

class Program
{
    static void Main(string[] args)
    {
        foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
        {
            Console.WriteLine(day);
        }
    }
}

このコードは、すべての曜日を順に出力します。

列挙型の表示名

列挙型の値に表示名を設定するには、カスタム属性を使用します。以下は、その一例です。

using System;
using System.ComponentModel;

enum DayOfWeek
{
    [Description("Sun")]
    Sunday,
    [Description("Mon")]
    Monday,
    [Description("Tue")]
    Tuesday,
    [Description("Wed")]
    Wednesday,
    [Description("Thu")]
    Thursday,
    [Description("Fri")]
    Friday,
    [Description("Sat")]
    Saturday
}

表示名を取得するには、リフレクションを使用します。

using System;
using System.ComponentModel;
using System.Reflection;

class Program
{
    static void Main(string[] args)
    {
        DayOfWeek today = DayOfWeek.Monday;
        string description = GetEnumDescription(today);
        Console.WriteLine($"Today is {description}");
    }

    static string GetEnumDescription(Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
        return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
    }
}

このコードは、「Today is Mon」と出力します。

列挙型の利点

列挙型を使用することで、コードの可読性と保守性が向上します。具体的には以下の利点があります。

  1. コードの可読性:定数を使わずに列挙型を使用することで、コードが直感的に理解しやすくなります。
  2. 型安全性:列挙型は型安全であり、無効な値の割り当てを防ぐことができます。
  3. デバッグとテストの容易さ:列挙型を使用することで、デバッグとテストが容易になります。特定の値を追跡しやすく、バグの原因を迅速に特定できます。
  4. 拡張性:列挙型は拡張しやすく、新しい値を簡単に追加できます。

列挙型の実践例

状態管理における列挙型

列挙型は、状態管理においてよく使用されます。以下は、簡単なタスク管理システムで列挙型を使用する例です。

using System;

enum TaskStatus
{
    NotStarted,
    InProgress,
    Completed,
    OnHold
}

class Task
{
    public string Name { get; set; }
    public TaskStatus Status { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Task task = new Task
        {
            Name = "Write blog post",
            Status = TaskStatus.NotStarted
        };

        Console.WriteLine($"Task: {task.Name}, Status: {task.Status}");

        task.Status = TaskStatus.InProgress;
        Console.WriteLine($"Task: {task.Name}, Status: {task.Status}");

        task.Status = TaskStatus.Completed;
        Console.WriteLine($"Task: {task.Name}, Status: {task.Status}");
    }
}

このコードは、タスクの状態を管理し、状態が変更されるたびに出力を更新します。

設定オプションにおける列挙型

列挙型は、設定オプションを管理するのにも役立ちます。以下は、アプリケーションの設定オプションを列挙型で管理する例です。

using System;

enum LogLevel
{
    Debug,
    Info,
    Warning,
    Error,
    Critical
}

class ApplicationSettings
{
    public LogLevel LogLevel { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        ApplicationSettings settings = new ApplicationSettings
        {
            LogLevel = LogLevel.Info
        };

        Console.WriteLine($"Current log level: {settings.LogLevel}");

        settings.LogLevel = LogLevel.Error;
        Console.WriteLine($"Updated log level: {settings.LogLevel}");
    }
}

このコードは、ログレベルの設定を管理し、設定が変更されるたびに出力を更新します。

まとめ

本記事では、C#における列挙型(Enum)の基本から応用までを解説しました。列挙型の宣言方法、使用方法、数値の扱い、フラグ列挙型、メソッドの利用、ループ処理、表示名の設定、実践例などを具体的なコード例とともに紹介しました。列挙型を理解し、活用することで、コードの可読性と保守性を向上させ、バグを減らすことができます。これからの開発プロジェクトで、列挙型を効果的に利用してみてください。

タイトルとURLをコピーしました