簡體   English   中英

在C#中是否需要枚舉開關上的默認情況?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM