2010-01-29 6 views
4

Je suis en train de lire an article, mais je ne comprends pas vraiment comment cela fonctionne avec l'opérateur logique. Quelqu'un peut-il m'expliquer cela?C#: opérateur bitwise dans enum (Autorisation personnalisée dans MVC)

par ex. Si je veux avoir 4 titres de niveau avec client, employé, superviseur et administrateur.

[Serializable] 
[Flags] 
public enum WebRoles 
{    
    customer= 1 << 0, 
    employee= 1 << 1, 
    supervisor = 1 << 2, 
    Admin = 2 << 3 
} 

puis comment je devrais implémenter la logique suivante.

if (Roles != 0 && ((Roles & role) != role)) 
      return false; 

Quelqu'un peut-il me fournir une certaine connaissance de cette implémentation?

Merci beaucoup.

Daoming

+0

Vous semblez confus au sujet des opérateurs "logiques" et "bitwise". Si vous utilisez une mauvaise terminologie, il sera beaucoup plus difficile de trouver l'information correcte. –

+0

@Anon, Merci pour cela. Je comprends cela maintenant. –

Répondre

1

Cet exemple utilise l'opérateur de décalage au niveau du bit: "< <". Cet opérateur prend les bits et les déplace. Par exemple, « 1 < < 3 » résultats dans le numéro 8. Donc, en binaire,

customer = 0001 
employee = 0010 
supervisor = 0100 
admin =  1000 (I think this was supposed to read 1 << 3) 

Maintenant, vous pouvez affecter plusieurs personnes rôles à l'aide ou l'opérateur au niveau du bit. Ce serait une seule barre verticale "|". Le bit ou combine les deux nombres bit par bit, en définissant chaque bit qui est défini dans l'un des deux opérandes.

myRole = customer | employee = 0011 

L'instruction if que vous avez est destinée à indiquer si quelqu'un a un rôle particulier. Il utilise bitwise-et: "&". Bitwise-et combine les deux nombres, en définissant un bit uniquement si le bit est défini dans les deux opérandes.

13

Ils utilisent un enum comme un bitmap: si un bit spécifique est défini, vous avez donc ce privilège. Ils utilisent également un opérateur de décalage vers la gauche. Laissez-moi essayer de démontrer tout cela à la fois:

 
Role   Decimal Binary Shifted Decimal 
--------  ------- ------ ------- ------- 
Customer = 1 = 000001 = 000001 = 1 
Employee = 1 = 000001 = 000010 = 2 
Supervisor = 1 = 000001 = 000100 = 4 
Admin  = 2 = 000010 = 010000 = 16 

De cette façon, vous pouvez combiner deux rôles. Par exemple, certains utilisateurs peuvent jouer Employee et Supervisor en même temps, juste en ayant des bits correspondants.

Et comment vérifier si un bit est défini? C'est exactement ce que fait le (Roles & role) != role). Par exemple:

WebRoles user = WebRoles.Employee | WebRoles.Supervisor; 
bool isEmployee = (user & WebRoles.Employee) == WebRoles.Employee; // true 

Si vous variable utilisateur de test pour vérifier si ce bit Employee est réglé, cet opérateur & retournera tous les bits de match.

Espérons cette aide; n'hésitez pas à modifier cette réponse