これを修正する1つの方法は、例外をキャッチしてスローする代わりに再帰呼び出しを使用するか、ループを使用することです(このような場合のループは、私の意見では意味を曖昧にします。やってる):
private static AnimalTypeEnum GetAnimalFromInput()
{
AnimalTypeEnum animal;
string s = Console.ReadLine();
switch (s.ToLower())
{
case "dog":
animal = AnimalTypeEnum.DOG;
break;
case "cat":
animal = AnimalTypeEnum.CAT;
break;
case "rabbit":
animal = AnimalTypeEnum.RABBIT;
break;
default:
Console.WriteLine(s + " is not valid, please try again");
animal = GetAnimalFromInput();
break;
}
return animal;
}
static void Main(string[] args)
{
AnimalTypeEnum animal = GetAnimalFromInput();
Console.WriteLine(animal);
}
また、スイッチをif / elseチェーンにリファクタリングし、if (s.Equals("dog", StringComparison.CurrentCultureIgnoreCase))
他のカルチャで機能し続けるために(または大文字と小文字を区別しない適切な比較)を使用することをお勧めします。もちろん、これはシナリオには当てはまらない場合があります(たとえば、テスト/宿題アプリ、または文化でのみ使用される可能性のあるもの)。
更新: Mennan Karaのアイデアに感謝します。値(eg "dog"
)が常に列挙型の値(eg)と一致する場合は、コードを改善するためにDOG
使用できます。Enum.TryParse
private static AnimalTypeEnum GetAnimalFromInput()
{
AnimalTypeEnum animal;
string s = Console.ReadLine();
if (Enum.TryParse(s, true, out animal))
return animal;
else
{
Console.WriteLine(s + " is not valid, please try again");
return GetAnimalFromInput();
}
}
それらを分離する柔軟性が必要な場合は、既存のスイッチを維持してください。