這裏有一種方法來解決它,使用遞歸調用,而不是需要捕捉並拋出異常,或在情況下使用循環(循環像這樣的混淆在我看來意義;太多關於你怎麼做,而不是你在做什麼)吧:
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);
}
我還會注意到,它是很好的做法,重構你的交換機成如果/ else鏈,使用if (s.Equals("dog", StringComparison.CurrentCultureIgnoreCase))
(或適當的不區分大小寫比較)來保持它在其他文化中的工作。當然,這可能不適用於您的場景(例如,測試/家庭作業應用程序,或僅可能用於您的文化的內容)。
更新:感謝Mennan卡拉的想法,如果你的價值觀(如"dog"
)將始終匹配枚舉的值(例如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();
}
}
如果您需要將它們分開的靈活性,請保留現有的開關。
添加'default:'子句。參考:http://msdn.microsoft.com/en-us/library/06tc147t.aspx – Joe 2012-07-29 12:46:26