C#で開発をしていると、enum
(列挙型)を使う場面に出くわすことがよくあります。たとえば曜日や状態、カテゴリなど、意味のある定数の集まりを扱いたいときに非常に便利です。enum
を使うことでコードの可読性や保守性が向上し、バグの予防にもつながります。
この記事では、C#におけるenum
の基本的な使い方から、活用パターン、注意点、便利なテクニックまで、初心者にもわかりやすく解説します。実務でも役立つ具体的な例を交えながらご紹介します。
enum
(列挙型)は、意味のある名前を持った整数の集合を定義するための型です。主に、複数の状態やオプションを扱いたいときに使われます。
enum 曜日
{
日曜日,
月曜日,
火曜日,
水曜日,
木曜日,
金曜日,
土曜日
}
上記のように定義することで、曜日
という独自の型を使って変数を宣言できます。
enum
は、何も指定しなければ0から始まる整数値が自動で割り当てられます。
enum ステータス
{
未処理, // 0
処理中, // 1
完了 // 2
}
値を明示的に指定することも可能です。
enum ステータス
{
未処理 = 1,
処理中 = 2,
完了 = 99
}
このようにすれば、意味のある数値を割り当てることができます。
列挙型を使って変数を宣言する方法は簡単です。
ステータス 現在のステータス = ステータス.未処理;
if文やswitch文でも活用できます。
switch (現在のステータス)
{
case ステータス.未処理:
Console.WriteLine("まだ処理されていません");
break;
case ステータス.処理中:
Console.WriteLine("現在処理中です");
break;
case ステータス.完了:
Console.WriteLine("処理が完了しました");
break;
}
enum
は内部的には整数として扱われているため、キャストが可能です。
int 数値 = (int)ステータス.処理中; // 2
逆に整数をenum
にキャストすることも可能ですが、定義されていない値も通ってしまう点に注意が必要です。
ステータス s = (ステータス)99;
Console.WriteLine(s); // 完了(明示定義済み)
ステータス s2 = (ステータス)100;
Console.WriteLine(s2); // 100(不正な値だがエラーにはならない)
複数の状態を同時に持たせたい場合、[Flags]
属性を使ったビットフラグが有効です。
[Flags]
enum 権限
{
なし = 0,
読み取り = 1,
書き込み = 2,
実行 = 4,
すべて = 読み取り | 書き込み | 実行
}
使用例:
権限 userPermission = 権限.読み取り | 権限.書き込み;
bool canWrite = (userPermission & 権限.書き込み) == 権限.書き込み;
Console.WriteLine(canWrite); // true
ステータス s = ステータス.完了;
string str = s.ToString(); // "完了"
ステータス s = (ステータス)Enum.Parse(typeof(ステータス), "処理中");
また、存在しない値を渡すと例外が出るため、Enum.TryParse
の使用が推奨されます。
if (Enum.TryParse("完了", out ステータス s))
{
Console.WriteLine("変換成功: " + s);
}
enum
の値の順番が変更されると予期せぬバグになる可能性があるenum
の名前に意味を持たせすぎると柔軟性が失われるenum エラーコード
{
なし = 0,
ネットワークエラー = 1,
データベースエラー = 2,
未知のエラー = 99
}
[Flags]
enum ロール
{
一般 = 1,
管理者 = 2,
システム管理者 = 4
}
enum
を正しく使うことで、コードの見通しがよくなり、保守性も向上します。単純な状態管理だけでなく、Flagsを活用した権限管理、定数の置き換えなど、多様な用途に対応できます。
実務でも頻繁に登場する機能なので、使い方をしっかりマスターしておくと、より洗練されたC#のコードを書くことができるでしょう。