如果不清楚位運算的同學,可以看我的這篇文章《基礎才是重中之重~位的運算》及《整形變量是否可以進行位運算(像枚舉類型一樣)》
今天我們主要要作的是,驗證位運算中或運算與加法運算(+),與非運算(減操作)與減法運算(-)之間的區別,對於一個被標示為Flags特性的枚舉類型和特殊的數值類型(2的N次方組成)來說,它們的位運算會存在一些特性,而我們利用這些特性可以減少我們程序設計時的復雜度,這個很重要。
我們的例子用一個枚舉類型的對象FileProperty來說明,看它的定義如下:
= = =
下面是對這個對象的位運算,先看一個或運算,我更習慣稱它為加法位運算:
en =|||| enAdd =++++, en.GetHashCode(), enAdd.GetHashCode());
我們看到,代碼中的被加了多次,我們看一下結果
通過上面的例子,我們知道,位運算時,無論你的相同的數值有多少重復,結果在計算時,只會產生一個值,如果想知道原理,可以把它轉換成二進制,結果就不難看出了。(或運算原則是:兩個操作數,按位置進行或運算,其中一個數只要為1,結果就為1)
| = | = | | =
下面是位運算中的與非運算,我更習慣稱它為減法位運算:
en2 =||||= en2 & (~(FileProperty.Read | FileProperty.Read)); Console.WriteLine(, en2);
結果為:
而如果希望檢查一個枚舉對象中(Flags類型的)是否包含某個枚舉元素,可以使用.net4.0中的HasFlag方法,讓我們來看一下
resultMsg = en + Console.WriteLine(resultMsg, FileProperty.Write,en.HasFlag(FileProperty.Write)); Console.WriteLine(resultMsg, FileProperty.Replace,en.HasFlag(FileProperty.Replace));
結果為:
利用這個特性,我們有這樣的一個工作,找到所有文件包含的屬性種類,看代碼:
FileID { ; Filename { ; FileProperty FileProperty { ;
List<File> fileList = List<File> File{FileID=,Filename=, FileProperty= File{FileID=,Filename=, FileProperty== = = FileProperty.Read |==>|= + propertyAll);
結果為:
有時,我們多掌握一點知識,可能會使我們設計的程序更加簡單,呵呵!