在適當(dāng)?shù)膱?chǎng)合使用FlagsAttribute修飾枚舉
FlagsAttribute 指示可以將枚舉作為位域(即一組標(biāo)志)處理(MSDN)。
所謂作為位域處理就是說(shuō)要求聲明枚舉的每一個(gè)數(shù)值沒(méi)有位重疊,例如0,1,4,8
在.Net framework中有很多枚舉都是用FlagsAttribute特性修飾,例如:正則表達(dá)式選項(xiàng)System.Text.RegularExpressions.RegexOptions、文件監(jiān)視中的文件改變類(lèi)型System.IO.WatcherChangeTypes、System.Web.UI.WebControls.DataControlRowState等等。
這樣聲明枚舉的好處是什么呢?
1. 這樣聲明便于表示 既有Flags.a 又有 Flags.b 例如在使用正則表達(dá)式選項(xiàng)的時(shí)候,我們可以方便的寫(xiě):RegexOptions.Compiled | RegexOptions.IgnoreCase來(lái)表示編譯和忽略大小寫(xiě)選項(xiàng)。
2. 便于驗(yàn)證是否包含某種枚舉變量,例如:
RegexOptions option = RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline;
bool includeIgnoreCaseOption = (option & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase;

3. 便于方便的從一個(gè)已經(jīng)賦值的枚舉變量中去掉某個(gè)選項(xiàng),例如
RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace;
RegexOptions notIgnoreCaseOptions = options & (~RegexOptions.IgnoreCase);
我們應(yīng)該在什么時(shí)候使用FlagsAttribute修飾我們聲明的枚舉呢?
如果聲明的枚舉對(duì)于a狀態(tài),b狀態(tài)有意義,并且對(duì)既有a狀態(tài)也有b狀態(tài)有意義的時(shí)候使用;如果枚舉只是表示一種狀態(tài),不需要狀態(tài)的組合,就不需要使用FlagsAttribute。

浙公網(wǎng)安備 33010602011771號(hào)