C#枚舉中的位運算權限分配


什么是位運算

常用的位運算主要有與(&), 或(|)和非(~), 比如:

1 01 & 00 = 00;
2 01 | 00 = 01;
3 ~01 =0 0;
運用在權限設計中

  先建立一個枚舉表示所有的權限管理操作:

1   [Flags] 
2   public enum Permissions 
3   { 
4   Insert = 1, 
5   Delete = 2, 
6   Update = 4, 
7   Query = 8 
8   }

  [Flags]表示該枚舉可以支持C#位運算。

  枚舉的每一項值, 我們用2的n次方來賦值, 這樣表示成二進制時剛好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等。

  每一位表示一種權限, 1表示有權限, 0表示沒有.

接下來是權限的運算:

  1. 權限的加法, 使用與運算來實現。

  0001 | 0100 = 0101, 表示同時具有第一位和第三位的權限管理了, 枚舉表示為:

1 Permissions per = Permissions.Insert | Permissions.Update

  2. 權限的減法, 使用與運算+非運算來實現。

  如上面要去掉Insert權限, 操作為:

1 Permissions per &= ~Permissions.Insert
2 // 即是 
3 0101 & ~0001 = 0101 & 1110 = 0100

   3. 權限的判斷, 使用與運算。

  判斷是否有操作權限時, 把用戶的的權限與操作權限進行與運算, 如果得到的結果仍是操作權限管理, 則表示用戶具有該權限:

1   Permissions per = Permissions.Insert | Permissions.Update; 
2   if(per & PermissionsPermissions.Insert = Permissions.Insert) 
3   { 
4   //有操作權限 
5   }

   比較過程為 0101 & 0001 = 0001, 0001的0位用與C#位運算把其它位都置成0, 變成只比較1的這一位.

總結

  我們總共講了3種操作方式:

  賦與權限、去除權限、判斷是包含權限。這樣我們的一個權限設計就基本滿足了。實際上在MSSQL這些關系數據庫中也是支持位運算的。

  有時候,比如訂單表,需要狀態非常多,如果某個狀態的設計是流水狀態下來的。就可以用“位”來設計這種狀態保存方式。並且由於數據庫是支持位運算的,所以我們也可以很容易在查詢結果時,直接篩選數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM