簡體   English   中英

MS代碼分析規則CA1008的解決方法:枚舉應具有零值

[英]Workaround of MS Code Analysis rule CA1008: Enums should have zero value

我正在研究.NET 4.0 / C#項目。 我為我的項目啟用了一些基本的代碼分析規則。 我被CA1008擊中了。 我完全理解為什么CA1008是必要的。

我正在處理的軟件與其他設備通信。 這些設備是可配置的。 配置存儲在內部EEPROM中。 其中一個配置是AlarmType ,在EEPROM中,其值可以是1到11.我已經定義了如下警報類型:

public enum AlarmType
{
    Type1 = 1,
    Type2 = 2,
    Type3 = 3,
    // ...
    Type10 = 10,
    Type11 = 11
}

在配置設備時,我允許用戶通過使用Enum.GetValues()獲取警報值來選擇其中一種警報類型。 檢查EEPROM中的值時,要求就像是從1到11的值,然后顯示警報的名稱,否則將其視為Type1

Visual Studio 2010會發出警告,指出AlarmType的值應等於零。 我不想添加這個,因為它會(1)違反AlarmType的定義( AlarmType不能為None )和(2)在枚舉枚舉值以呈現給用戶時,需要額外的檢查以排除None選項。

而不是抑制CA1008,我可以做什么作為一種解決方法? 我的設計中做錯了嗎?

AlarmType的默認值為0.例如,在此行代碼之后

AlaramType alarmType;

alarmType值為0.但是,由於沒有相應的枚舉值,它現在具有無效值。 這就是警告和你的陳述的原因

我不想添加這個,因為它會(1)違反AlarmType的定義(AlarmType不能為None)和(2)在枚舉枚舉值以呈現給用戶時,需要額外的檢查以排除None選項。

不太正確。 實際上, AlarmType所有實例在分配之前都將具有值0,如果要進行防御性編碼,則必須驗證AlarmType是否具有有效值。 未定義值0的名稱不會以任何方式保護您免受AlarmType變量為0的情況,因為它們未初始化。

我建議您定義一個0枚舉值,並將其命名為InvalidNone或描述枚舉變量尚未初始化的內容。

或者,如果您不想這樣做,可以使用屬性禁止警告。

在你的情況下,你的規則可能更容易添加和例外,但是如果你不想這樣做,你可以用0開始枚舉並創建一個擴展方法,這將提供正確的EEPROM值,這里有可能的擴展方法:

  public static int AsEeprom(this AlarmType etype)
    {
      return ((int)etype) + 1;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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