C#のプログラミングにおいて、特定の値のセットを扱いたいことはよくあります。
曜日、色、ステータスコードといった、限られた値を取るデータを効率的に管理するには、enumを使うのが便利です。enumを活用することで、関連する定数群に意味のある名前を付けてコードの意図を明確にできます。
この記事では、C#のenumについて、基本的な概念から具体的な使い方、数値(int)や文字列(string)との変換方法、要素数の取得といった応用テクニック、そして効果的な「使いどころ」や「命名規則」に至るまで、網羅的に解説します。
目次
1.C#のenum(列挙型)とは?
まずはC#のenumについて基本概念や使いどころを紹介します。
C#のenum(列挙型)がどのようなもので、どのような場面で利用されているのか押さえておきましょう。
C# enumの基本概念
C#のenum(列挙型)は、関連する定数の集合を定義するためのデータ型です。
例えば、プログラム内で信号の色「赤」「黄」「青」を扱う場合、それぞれを数値の 0, 1, 2 で表現する代わりに、SignalColor というenumを定義し、Red, Yellow, Blue という名前で扱えるようにします。
enum SignalColor{ Red, Yellow, Blue } |
これにより、コードを読む際に 0 や 1 といった数値が何を表しているのかを推測する必要がなくなり、「SignalColor.Red」のように、その値が何を意味するのかが一目で理解できるようになります。このように、enumを使用することで、コードの可読性や保守性の向上につながります。
enumは、内部的には整数型(デフォルトではint)として扱われますが、定義された名前を使用して値を参照することができます。これにより、コードの意味が明確になり、誤った値の操作を防げる点が大きな特徴です。
C# enumの使いどころ
enumの主な使いどころは以下のとおりです。
状態管理:アプリケーションの状態(例:Active、Inactive、Suspendedなど)を表現する。
固定値の管理:曜日や月、方向(例:North、South、East、West)などの固定値を扱う。
設定値やオプションの分類: 特定の機能に関する設定オプションや、処理のモードなどを分類する
権限レベル: ユーザーのアクセス権限レベル(Admin, Editor, Viewerなど)を定義する
このように、enumは意味のある名前で分類・管理したい定数群がある場面で使われます。
2.C#enumの基本的な使い方
この章ではenumの具体的な使い方を紹介します。
C#でenumをどのように定義し、コード内で利用するのか、そして基底となるデータ型を指定する方法や、推奨される命名規則について解説します。
C# enumの定義方法
C#でenumを定義するには、enumキーワードを使用します。基本的な構文は以下の通りです。
enum EnumTypeName { MemberName1, // 内部的な値は 0 MemberName2, // 内部的な値は 1 MemberName3 // 内部的な値は 2 // ... 必要に応じてメンバーを追加 } |
EnumTypeName: 定義するenumの型名を指定します(例: SignalColor, OrderStatus)。
MemberName1, MemberName2, ...: enumに含まれるメンバー(定数)の名前を指定します(例: Red, Yellow, Blue)。
各メンバーには、デフォルトで int 型の数値が 0 から順に自動的に割り当てられます。
特定の数値を明示的に割り当てたい場合は、以下のように記述します。
enum ErrorCode { None = 0, FileNotFound = 101, AccessDenied = 102, Unknown = 999 // 順序通りでなくても、重複しなければOK } |
C# enumの型指定の方法
デフォルトでは、enumの基礎となる型はintですが、他の整数型(byte、short、long)を指定することもできます。
型指定は以下のように行います。
enum Colors : byte { Red = 1, Yellow = 2, Blue, // 自動的に3になる White, // 自動的に4になる Black = 100 } |
指定できる基底型は、byte, sbyte, short, ushort, int (デフォルト), uint, long, ulong のいずれかの整数型です。char は指定できません。基底型を変更した場合、その型の範囲を超える値をメンバーに割り当てることはできません。
C# enumの命名規則
C# enumの命名規則は以下の通りです。
enum名は名詞または名詞句を使用し、PascalCase(先頭大文字)で記述
単数形を使用(例:Color、DayOfWeek)
列挙子(enum値)も同様にPascalCaseで記述
接頭辞や接尾辞(Enum、Flags)は避ける
これらの命名規則を守ることで、コードの可読性が向上し、他の開発者が理解しやすくなります。
関連記事
C#とは?基本文法や特徴、メリット、開発分野まで初心者に必要な情報をわかりやすく解説
3.C# enumと数値(int)の相互変換
enumは内部的に数値を持っていますが、そのままでは数値として扱えません。実際の開発では、enumの値をデータベースに保存したり、外部システムと連携したりするときに、基底となる数値と相互に変換する必要があります。
この章では、enumメンバーを数値に変換する方法、および数値をenumメンバーに変換する方法について、キャストを用いた基本的な操作を中心に解説します。
C# enum値からint型への変換
C#では、enumの値をint型に変換できます。これは、enumが内部的に整数型として扱われているためです。
enum型の変数やメンバーが持つ内部的な数値を取得するには、基底となる数値型への明示的なキャストを行います。
enum DaysOfWeek { Sunday, // 0 Monday, // 1 Tuesday, // 2 Wednesday, // 3 Thursday, // 4 Friday, // 5 Saturday // 6 }
{ static void Main() { DaysOfWeek today = DaysOfWeek.Monday; int dayValue = (int)today; // enum値をint型にキャスト Console.WriteLine(dayValue); // 出力: 1 } } |
この例では、DaysOfWeek.Mondayをint型にキャストして、その値(1)を取得しています。
enum値からint型に変換することで、enumの値をデータベースに保存したり、数値として計算に利用したりできます。
C# int型からenum値への変換
int型からenum値への変換も同様に、キャスト演算子を使用します。キャスト演算子 () の中に、変換先のenum型名を指定します。
enum DaysOfWeek { Sunday, // 0 Monday, // 1 Tuesday, // 2 Wednesday, // 3 Thursday, // 4 Friday, // 5 Saturday // 6 }
{ static void Main() { int dayValue = 2; DaysOfWeek day = (DaysOfWeek)dayValue; // int型をenum値にキャスト Console.WriteLine(day); // 出力: Tuesday } } |
この例では、整数値2をDaysOfWeek型にキャストして、その値(Tuesday)を取得しています。
ただし、指定した整数値に対応するenum値が存在しない場合でも例外は発生せず、その整数値がそのままenum値として扱われるため注意が必要です。
外部から受け取った数値をenumに変換するときは、Enum.IsDefined()メソッドなどを用いてその数値がenumの有効なメンバーに対応するかどうかを検証することが推奨されています。
C# enum値からint型をキャストなしで扱う方法
キャストを使わずにenum値からint値を取得するには、Enum.ToObject()メソッドを使用する方法があります。
enum Priority { Low, // 0 Normal, // 1 High // 2 }
{ static void Main() { int priorityCode = 0; object enumObject = Enum.ToObject(typeof(Priority), priorityCode); // 数値からobjectへ Priority priority = (Priority)enumObject; // objectからenumへキャスト Console.WriteLine($"Enum.ToObject: {priority}"); // 出力: Enum.ToObject: Low } } |
Enum.ToObjectメソッドは、指定された数値に対応するenumメンバーを object 型として返します。
また、System.Convert クラスを使う方法もあります。
enum DaysOfWeek { Sunday, // 0 Monday, // 1 Tuesday, // 2 Wednesday, // 3 Thursday, // 4 Friday, // 5 Saturday // 6 }
{ static void Main() { DaysOfWeek today = DaysOfWeek.Wednesday; int dayValue = Convert.ToInt32(today); // Convertクラスを使用して変換 Console.WriteLine(dayValue); // 出力: 3 } } |
Convertクラスには、様々な型への変換メソッドが用意されており、enumと数値の相互変換にも使用できます。
関連記事
C#演算子完全ガイド:比較・Nullの基礎からオーバーロード・優先順位などの応用まで徹底解説
4.C# enumと文字列(string)の紐づけと変換方法
enumの値をログに出力したり、ユーザーインターフェースに表示したり、設定ファイルから読み込んだりするときなど、enumメンバーの名前とenumの値とを紐づけたいときもあります。
この章では、enumの値に表示用の文字列を紐づける方法を紹介します。
C# enum値から文字列への変換
enumの値を文字列に変換する最も簡単な方法は、ToStringメソッドを使用することです。このメソッドは、enumの値をその名前に対応する文字列として返します。
Days day = Days.Monday; string dayName = day.ToString(); // "Monday"が取得される |
また、Enum.GetName()メソッドを使用することもできます。
Enum.GetName() メソッドは、enumの型とメンバーの値を指定してそのメンバー名を取得します。特定の数値に対応する名前を取得したい場合などに利用できます。
string dayName = Enum.GetName(typeof(Days), Days.Monday); // "Monday" |
C# enumで名前から値を取得
名前(文字列)からenum値に変換するには、Enum.Parse()メソッドを使用します。このメソッドは、指定された文字列がenumの名前と一致している場合にその値を返します。
string dayName = "Monday"; Days day = (Days)Enum.Parse(typeof(Days), dayName); |
大文字小文字を区別せずに変換したい場合は、第3引数にtrueを指定します。
string dayName = "monday"; Days day = (Days)Enum.Parse(typeof(Days), dayName, true); |
なお、Enum.Parseは文字列がenumの名前と一致していない場合に例外をスローします。そのため、事前に文字列が有効であるかどうかを検証するのがおすすめです。
string inputString = "monday"; // 変換元の文字列 // Enum.TryParse<TEnum> を使用して変換を試みる (大文字小文字は区別しない: true) if (Enum.TryParse<Days>(inputString, true, out Days parsedDay)) { // 変換成功時の処理 Console.WriteLine($"文字列 '{inputString}' から enum値 {parsedDay} への変換に成功しました。"); } else { // 変換失敗時の処理 Console.WriteLine($"文字列 '{inputString}' から Days enum への変換に失敗しました。"); } |
この例では、Enum.TryParseを使用して変換を試みて、失敗した場合はエラーメッセージを表示しています。
C# enumに表示用文字列を紐づける方法
enumメンバー名は通常、プログラム内部で分かりやすい英語名が使われますが、UIの表示やレポート出力などでは、日本語の分かりやすい説明やスペースを含む文字列を使いたい場合があります。
このような場合に、enumメンバーにカスタム文字列を「紐づけ」る方法として System.ComponentModel.DescriptionAttribute が利用できます。
using System.ComponentModel;
{ [Description("処理待ち")] Pending,
Processing,
Shipped,
Cancelled } |
enumの値からこの DescriptionAttribute の値を取得するためには、ヘルパーメソッドを用意する必要があります。拡張メソッドとして実装すると便利です。
using System; using System.ComponentModel; using System.Reflection; // リフレクションに必要
{ public static string GetDescription(this Enum value) { // enum値からFieldInfoを取得 FieldInfo fieldInfo = value.GetType().GetField(value.ToString()); if (fieldInfo == null) return value.ToString(); // フィールド情報が見つからない場合はメンバー名を返す
var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
return attribute != null ? attribute.Description : value.ToString(); } } |
定義した拡張メソッドを使って、enumの値から紐付けられた説明文字列を取得できます。
OrderStatus status = OrderStatus.Processing; string statusDescription = status.GetDescription(); // 拡張メソッドを呼び出す
Console.WriteLine(status.GetDescription()); // 出力: 発送済み |
このように DescriptionAttribute を使うことで、enumの定義自体にUI表示などに適した文字列情報を持たせることができ、コードの他の箇所で表示文字列をハードコーディングする必要がなくなります。
関連記事
C# Splitメソッド完全ガイド|複数区切り文字・正規表現・空白削除・最初や最後の要素を取得する方法まで
5.C# enumの要素数と値の取得方法
これまでにenumの基本的な使い方と、数値や文字列との変換方法を見てきました。ここではさらに踏み込んで、enumに関する応用的なテクニックをいくつか紹介します。
C# enumの要素数の取得
C#でenumの要素数を取得するには、主に2つの方法があります。
最も一般的な方法はEnum.GetValuesメソッドを使用する方法です。
public enum Colors { Red, Yellow, Blue, White, Black }
int count = Enum.GetValues(typeof(Colors)).Length; Console.WriteLine($"要素数: {count}"); // 出力: 要素数: 5 |
もう一つの方法はEnum.GetNamesメソッドを使用する方法です。
int length = Enum.GetNames(typeof(Colors)).Length; Console.WriteLine($"要素数: {length}"); // 出力: 要素数: 5 |
どちらの方法も同じ結果を返しますが、GetNamesメソッドは名前の配列を返し、GetValuesメソッドは値の配列を返すという違いがあります。
すべてのenum値を列挙
enumのすべての値を列挙するには、Enum.GetValuesメソッドを使用して配列を取得し、それをループで処理します。
enum DaysOfWeek { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }
{ static void Main() { foreach (DaysOfWeek day in Enum.GetValues(typeof(DaysOfWeek))) { Console.WriteLine(day); } } } |
このコードの出力は以下のようになります。
Sunday Monday Tuesday Wednesday Thursday Friday Saturday |
この方法を使用することで、enumのすべての値を簡単に列挙できます。
関連記事
【C#】Listと配列との違いや初期化・削除・要素数取得・型指定なしの使い方を紹介
C# foreach完全ガイド|基本構文からコレクション操作・LINQ連携・ループ制御まで徹底解説
6. まとめ
本記事では、C#におけるenum(列挙型)について、その基本的な概念や使いどころ、定義方法、基底型の指定、命名規則、数値(int)や文字列(string)との相互変換、要素数やメンバー一覧の取得といった応用的なテクニックまで、網羅的に解説しました。
C#のenumは、状態や固定値を扱うときに便利なデータ型です。enumを適切に使用することで、誤った値の使用を防ぎ、バグの発生を抑えることが可能です。
今回紹介した知識を活用して、より効率的かつ保守性の高いコードを書いていきましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。
自身に最適なフリーランスエージェントを探したい方はこちらよりご確認いただけます。