今回は、C#のEnum(列挙型)の使い方についてご紹介します。
Enumとは
Enumは、関連する定数をひとまとめに管理できる列挙型の仕組みです。
数字で扱うより可読性が高く、定義されていない値を誤って使用するリスクを減らすメリットがあります。
C#ではenumキーワードを使用して定義し、主に定数の集合を表現したい場面で活用されます。
Enumの基本的な使い方
定義方法としては、まずenumキーワードの後ろに型名、波括弧内に列挙名を羅列する形が一般的です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum Weekday { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } // Enumの変数を宣言・利用する例 Weekday today = Weekday.Wednesday; Console.WriteLine($"今日は {today} です。"); // 文字列に列挙型を組み込んで表示 |
今日は Wednesday です。
列挙子( Sunday など)には自動的に 0 から順に整数値が割り当てられます。
列挙型と整数値を相互変換する際はキャストを利用しますが、定義していない値でもキャスト自体が可能なため、取り扱いには注意が必要です。
実用的な具体例
明示的な値の指定と基礎型変更
定義の際に明示的な値を割り当てることで、整数値との対応を正確に表現できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
enum StatusCode { Success = 200, BadRequest = 400, NotFound = 404, InternalServerError = 500 } // 整数値へのキャスト StatusCode code = StatusCode.NotFound; int numericCode = (int)code; Console.WriteLine(numericCode); // 404 |
404
また、必要に応じて基礎型を変えることも可能です。
1 2 3 4 5 6 |
enum SmallNumber : byte { Zero, One, Two } |
byteを基礎型に指定することで、メモリ使用量を抑える使い方もできます。
[Flags]属性を使ったビットフラグの利用
複数のフラグを組み合わせて表現したい場合は、[Flags]属性を利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Flags] enum FileAccess { None = 0, Read = 1 << 0, // 1 Write = 1 << 1, // 2 Execute = 1 << 2 // 4 } FileAccess permissions = FileAccess.Read | FileAccess.Write; Console.WriteLine(permissions); // Read, Write // 特定のフラグを含んでいるかのチェック bool canWrite = (permissions & FileAccess.Write) == FileAccess.Write; Console.WriteLine($"書き込み権限: {canWrite}"); |
Read, Write
書き込み権限: True
[Flags]を付与することで、複数の列挙値をビット演算子で簡単に合成・判定できます。
Enumの文字列変換とTryParse
Enum.ParseやEnum.TryParseを使えば、文字列との変換が容易に行えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
string inputStatus = "NotFound"; StatusCode statusFromString = (StatusCode)Enum.Parse(typeof(StatusCode), inputStatus); Console.WriteLine(statusFromString); inputStatus = "Success"; if (Enum.TryParse(inputStatus, out StatusCode parsedStatus)) { Console.WriteLine($"変換成功: {parsedStatus}"); } else { Console.WriteLine("変換失敗"); } |
NotFound
変換成功: Success
無効な文字列が入力される可能性がある場合は、例外を出さないTryParseが安全です。
Enumを活用する際の注意点
Enumに未定義の値をキャストで代入するとコンパイルエラーにはならず、意図しない動作をする可能性があります。
そのため、Enum.IsDefinedや入力値のチェックで不正値を排除する実装を検討することが大切です。
新しい列挙値を追加すると、Switch文や関連処理への影響を及ぼす点も踏まえて運用しましょう。
さらに、ビットフラグを運用する場合は2の冪乗値に基づく設計を行い、複雑になりすぎる場合は別の方法を検討することが望ましいです。
まとめ
Enumは定数の集合を一元管理できる便利な機能で、コードの可読性や安全性を向上させます。
明示的な値割り当てや[Flags]属性など多彩な機能を併用することで、柔軟に設計可能です。
要件と注意点をしっかり理解して適切に運用することで、品質と保守性を高められます。