FlagsAttribute屬性在enum中的應用

2021-05-01 18:41:08 字數 1054 閱讀 7130

我看了effective c#一書中的item 8 : ensure that 0 is a valid state for value types時提到了flags屬性在enum中的應用,於是就查了一下資料,寫了一點關於這個的體會

.net c#中列舉的宣告格式如下所示:

複製  儲存[attributes] [modifiers] enum identifier [:base-type] [;]

flagsattribute屬性就是列舉型別的一項可選屬性。它的主要作用是可以將列舉作為位域處理(p.s. c#不支援位域)。所謂位域是單個儲存單元內相鄰二進位制位的集合。通過為列舉新增這個屬性,可以改變列舉的一些行為來滿足我們的需要。

我們宣告這樣乙個列舉,並執行如下語句:

複製  儲存enum myflags ;

myflags myflag = myflags.flag2 | myflags.flag3;

console.writeline(myflag);

得到的結果是:

flag4

因為對於整數來說,|操作就是將其轉化為二進位制再進行或運算。flags.flag2 | flags.flag3做的工作實際上是 0001 | 0010 = 0011 = 3再轉換成(myflags)3就是flag4了

而如果將列舉宣告為:

複製  儲存[flagsattribute]

enum myflags

;則上述程式的結果為:

flag2,flag3

這樣做的意義在於我們可以實現「或」的關係

就上例而言,myflag可以更直觀的表現為011,因此當我們想要檢驗它滿足哪個列舉值時我們可以使用&操作

複製  儲存if ((myflag & myflags.flag2) == myflags.flag2)

if ((myflag & myflags.flag3) == myflags.flag3)

011&001 = 001,011&010 = 010,因此這兩個if都會成立,這就是這種列舉的意義吧。另外我們應當注意預設初始化的myflag的值為0,與其作&運算不會有任何結果。

學習列舉型別 FlagsAttribute屬性

網上查了下資料,發現沒我想知道東西,只能自己研究一下,關於列舉的詳細由於晚上還有點事,就不怎麼寫了下面我給大家演示一下eum類中幾種方法enum.isdefined,enum.parse,enum.getname,enum.getnames,enum.getvalues.先說一下system.enu...

android layout weight屬性學習

雖然這個android layout weight屬性很怪異,但幸運的是我們達到了目標 按比例顯示linearlayout內各個子控制項,需設定android layout width 0dp 如果為豎直方向的設定android layout height 0dp 在這種情況下某子個控制項占用lin...

ios autoresizingMask屬性的研究

在 uiview 中有乙個autoresizingmask的屬性,它對應的是乙個列舉的值 如下 屬性的意思就是自動調整子控制項與父控制項中間的位置,寬高。1 2 3 4 5 6 7 8 9 enum uiviewautoresizingnone就是不自動調整。uiviewautoresizingfl...