C# Programming

C#における堅牢な文字列から列挙型への変換

Spread the love

列挙型は、C#において名前付き定数の集合を表すための貴重なツールです。多くの場合、列挙値の文字列表現を元の列挙型に変換する必要があります。この記事では、この変換を安全かつ効率的に実行するための様々な手法を探ります。

目次

Enum.Parse()Enum.TryParse()の使用

C#は、文字列から列挙型への変換のために、主に2つのメソッドを提供します。Enum.Parse()Enum.TryParse()です。Enum.Parse()は簡単ですが、入力文字列が定義済みの列挙値と一致しない場合、例外をスローします。Enum.TryParse()はより安全な代替手段を提供し、成功または失敗を示すブール値を返します。

Enum.Parse()の例:


public enum DaysOfWeek
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

public static DaysOfWeek ParseDay(string dayString)
{
    return (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), dayString, true); //大文字小文字を無視
}

Enum.TryParse()の例:


public static bool TryParseDay(string dayString, out DaysOfWeek day)
{
    return Enum.TryParse(dayString, true, out day); //大文字小文字を無視
}

Enum.TryParse()は例外を回避するため、無効な値の可能性があるユーザー入力や外部データの処理には、こちらが推奨されます。

Enum.Parse()での例外処理

Enum.TryParse()が推奨されているとはいえ、Enum.Parse()での例外処理の理解は重要です。try-catchブロックは、潜在的なArgumentExceptionを適切に処理できます。


public static DaysOfWeek ParseDayWithExceptionHandling(string dayString)
{
    try
    {
        return (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), dayString, true); //大文字小文字を無視
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine($" '{dayString}'の解析エラー: {ex.Message}");
        //エラーを適切に処理します。例えば、デフォルト値を返すか、カスタム例外をスローします。
        return DaysOfWeek.Monday; //またはカスタム例外をスロー
    }
}

Enum.IsDefined()を使用した有効な列挙値の確認

解析する前に、Enum.IsDefined()を使用して、入力文字列が有効な列挙値に対応しているかどうかを確認することをお勧めします。これにより、コードの堅牢性が向上し、不要な例外を防ぐことができます。


public static bool IsValidDay(string dayString)
{
    return Enum.IsDefined(typeof(DaysOfWeek), dayString);
}

ベストプラクティスと推奨事項

ほとんどの場合、例外を安全に処理できるため、Enum.TryParse()が推奨されます。解析前にEnum.IsDefined()と組み合わせて、検証を強化してください。堅牢でユーザーフレンドリーなアプリケーションを構築するには、常に潜在的なエラーを適切に処理してください。変換失敗を効果的に管理するために、デフォルト値を使用するか、カスタム例外をスローすることを検討してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です