程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#中利用“|”運算組合多項

c#中利用“|”運算組合多項

編輯:C#入門知識

  前幾天看到一段代碼   int i = GetCount(para1 | para2);   咋一看有些莫名奇妙,怎麼傳參的時候帶了個或運算,其實這裡面是有講究的,查閱了各方資料,QQ群裡賴著大牛問,才搞明白。這個運算可以用來進行多項組合。        舉個例子,在設計權限的時候,你肯定會這樣設計,權限A,做什麼,權限B,做什麼,權限C,做什麼...如此定義權限,在調用處理函數時,我們直接傳對應的權限Id就行,假設用戶甲有A權限,我很明確得傳權限A的Id,用戶乙有B權限,我傳B權限的Id,這樣看來似乎是合理的。但是,如果用戶丙同時有A權限和B權限怎麼辦呢,你可能會說,那我定義權限的時候定個AB’的權限好了,這樣凡是同時有A和B權限的用戶傳AB’的Id就行了,我一開始也是這麼想的,不過,這個做法是不推薦的,也是不巧妙的,假如還有用戶同時有ABC權限,或者BC權限,或者CD權限,那麼我就什麼事也不用干了,就一直在給它定義類型了。      推薦的做法是,傳參用“|”運算組合,處理用“&”運算拆分,這樣,調用者可以隨意組合,而對於處理者,則只定義最基本的單個處理“&”判斷即可。看個例子:      定義一個枚舉表示權限類型: 復制代碼 public enum Privilege     {         Read = 0x01,         Write = 0x02,         Add = 0x04,         Delete = 0x08,     } 復制代碼      定義一個處理函數: 復制代碼 public void GetPrivilege(Privilege pri) {         if ((pri & Privilege.Read) == Privilege.Read)         {             //do something         }         if ((pri & Privilege.Write) == Privilege.Write)         {             //do something         }         if ((pri & Privilege.Add) == Privilege.Add)         {             //do something         }         if ((pri & Privilege.Delete) == Privilege.Delete)         {             //do something         } } 復制代碼     然後在其他地方調用: 復制代碼 ...     GetPrivilege(Privilege.Read);     GetPrivilege(Privilege.Write);     GetPrivilege(Privilege.Add);     GetPrivilege(Privilege.Delete);     GetPrivilege(Privilege.Read | Privilege.Write);     GetPrivilege(Privilege.Write | Privilege.Add);     GetPrivilege(Privilege.Read | Privilege.Write | Privilege.Add); ... 復制代碼      你會看到每次調用都會精准得執行。為什麼可以這樣呢,看我定義的枚舉,對應的值分別是 0x01 0x02 0x04 0x08   為什麼我不定義成0x01,0x02,0x03,0x04,這是就依賴於我一開始講的“|”和“&”運算了,“|”或運算是只要有1方為1就為1,“&”與運算是兩者都為1才為1,把0x01,0x02,0x04,0x08轉成2進制就是   0001 0010 0100 1000

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved