C# enumで決められた状態を表す
注文状態を文字列で持つと、"shippd"のようなタイプミスもコンパイルできます。候補が固定されている値はenumで表せます。
状態を定義する
public enum OrderStatus
{
Waiting = 1,
Shipped = 2,
Canceled = 3,
}
OrderStatus status = OrderStatus.Waiting;
if (status == OrderStatus.Waiting)
Console.WriteLine("発送を待っています。");数値を明示すると、途中へ値を追加しても既存値がずれません。DBや外部APIへ数値として保存する場合、番号は契約になるため、公開後に別の意味へ変更しません。
文字列から変換する
string input = "shipped";
if (Enum.TryParse<OrderStatus>(input, ignoreCase: true, out var status))
Console.WriteLine(status); // Shipped
else
Console.WriteLine("不明な注文状態です。");利用者の入力やCSVの値は変換に失敗する可能性があるため、ParseよりTryParseが扱いやすい場合があります。
数値入力をそのまま信用しない
bool parsed = Enum.TryParse<OrderStatus>("999", out var status);
Console.WriteLine(parsed); // True
Console.WriteLine(Enum.IsDefined(status)); // FalseTryParseは未定義の数値でも成功することがあります。外部入力ではEnum.IsDefinedも確認します。
if (!Enum.TryParse<OrderStatus>(input, true, out var status) ||
!Enum.IsDefined(status))
{
Console.WriteLine("定義されていない状態です。");
}APIで名前を送る場合
ASP.NET CoreでJSONを"shipped"のような名前として扱う場合は、JSONのenum変換設定を明示します。数値と文字列のどちらを契約にするか決め、クライアントと統一します。
外部サービスのenumへ新しい値が追加される可能性がある場合、未知の値で失敗する設計が適切か確認します。