[英]In C# is default case necessary on a switch on an enum?
我見過與C ++有關的帖子,但我特地要求C#.NET(4.0+)。
在以下示例中是否需要默認情況?
public enum MyEnum : int
{
First,
Second
}
public class MyClass
{
public void MyMethod(MyEnum myEnum)
{
switch (myEnum)
{
case MyEnum.First: /* ... */ break;
case MyEnum.Second: /* ... */ break;
default: /* IS THIS NECESSARY??? */ break;
}
}
}
這是一個常見的誤解,即.Net枚舉值僅限於枚舉中聲明的值。 實際上,雖然它們可以是枚舉的基本類型范圍內的任何值(默認情況下為int
)。 例如,以下內容完全合法
MyMethod((MyEnum)42);
此代碼將在沒有警告的case
編譯,並且不會打開任何case
標簽。
現在,您的代碼是否選擇處理此類方案是一項策略決策。 這不是必要的,但我肯定會建議有一個。 我更喜歡為枚舉上的每個switch
添加一個default
,我使用以下模式專門為此場景編寫
switch (value) {
...
default:
Debug.Fail(String.Format("Illegal enum value {0}", value));
FailFast(); // Evil value, fail quickly
}
這不是絕對必要的,但有人可能會傳入您的枚舉未涵蓋的值(因為枚舉實際上並不限制允許的參數值的范圍)。
如果指定的值是意外的,我通常會添加一個默認值並throw
。
這不是技術上必要的,但因為你可以很容易地蒙上了價值MyEnum
的底層類型(通常是int)以實例MyEnum
。 因此,最好在其中添加一個帶有Debug.Assert()
的默認語句。
這不是必需的,而是良好的做法,因為有人可能會在以后引入新的枚舉。 例如,拋出一個異常,指示未處理“未知”枚舉。
不,默認情況不是必需的。
從純粹的代碼角度來看,沒有要求具有default
情況。 這完全取決於您的邏輯要求。
如果你將枚舉值添加到enum中,則需要使用枚舉未定義的值(不會拋出異常)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.