2009-10-22 61 views
4

爲了在顯示新聞報道的方法上允許不同的格式選項,我創建了一個可以傳入的枚舉來指定它的顯示方式。做.net FlagsAttribute枚舉需要手動賦值嗎?

[Flags] 
private enum NewsStyle 
{ 
    Thumbnail = 0, 
    Date = 1, 
    Text = 2, 
    Link = 4, 
    All = 8 
} 

string FormatNews(DataRow news, NewsStyle style) 
{ 
    StringBuilder HTML = new StringBuilder(); 

    // Should the link be shown 
    if (((newsStyle & NewsStyle.All) == NewsStyle.All || (newsStyle & NewsStyle.Link) == NewsStyle.Link)) 
    { 
       HTML.AppendFormat("<a style=\"text-decoration:none; color: rgb(66, 110, 171);\" href=\"ViewStory.aspx?nsid={0}\">", 
            UrlEncode(newsStory["NewsStoryID"].ToString())); 
    } 

    // Etc etc... 
} 

// So to call the method... 
Response.Write(FormatNews(news, NewsStyle.Date | NewsStyle.Text)); 

的問題是,我只能得到,如果我上手工指定枚舉值的代碼工作,否則按位枚舉檢查操作無法正常工作。

我一直遵循let的規則處理賦值給枚舉 - 這是一個geniuine異常嗎?

回答

8

是的,這是一個真正的例外。無論FlagsAttribute是什麼,默認枚舉都是從0開始分配的值,每個值比前一值高1。 (當然也有,當你手動指定一些值,更詳細的規則 - 看MSDN docs

雖然它有些有意義有一個標誌枚舉中的兩個大國自動獲得價值,我看到的原因是也許最好不要這樣做:

這是完全合理的,有一個枚舉這樣的:

[Flags] 
enum Foo 
{ 
    None, 
    Bar, 
    Baz, 
    BarAndBaz 
} 

當然需要的值是0,1,2和3是明智的。

讓單純屬性的存在改變一段C#代碼的整個含義是非常不直觀的。考慮我的Foo示例枚舉。是否允許刪除Flags屬性通過靜默更改枚舉數值來破壞代碼?

+0

感謝您的回答和關於推理的優點 – 2009-10-22 14:29:08

0

是的,您必須指定Enum中的值才能使添加的標誌值正常工作(能夠組合兩個枚舉標誌並且不會使該值與指定的另一個標誌衝突)。你不必指定值來編譯它,但結果很可能不是你正在尋找的。