[英]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枚舉值,並將其命名為Invalid
或None
或描述枚舉變量尚未初始化的內容。
或者,如果您不想這樣做,可以使用屬性禁止警告。
在你的情況下,你的規則可能更容易添加和例外,但是如果你不想這樣做,你可以用0開始枚舉並創建一個擴展方法,這將提供正確的EEPROM值,這里有可能的擴展方法:
public static int AsEeprom(this AlarmType etype)
{
return ((int)etype) + 1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.