Enumerations in C#
Während man in anderen Programmiersprachen (wie beispielsweise PHP) eine Sammlung von Konstanten bemühen muss, um zumindest so etwas ähnliches wie einen Aufzählungstypen zu definieren, bietet uns C# hierfür eine komfortable und zugleich typsichere Lösung mittels
Häufig finden derartige Aufzählungen im Rahmen von Optionen für Methodenaufrufe Verwendung; auch im .NET-Framework begegnet ihr diesen sehr häufig (z. B. bei Dateioperationen mit der Enumeration
):
Dazu passen wir zuerst einmal unsere Aufzählung an, da wir zu diesem Zwecke Zweierpotenzen als Werte benötigen und geben auch gleich das Attribut mit an. Der späteren Bequemlichkeit wegen, erstellen wir auch noch einen weiteren Wert
enum
an.Häufig finden derartige Aufzählungen im Rahmen von Optionen für Methodenaufrufe Verwendung; auch im .NET-Framework begegnet ihr diesen sehr häufig (z. B. bei Dateioperationen mit der Enumeration
FileMode
). Als Beispiel soll hier das Recht eines Benutzers dienen. Zuerst definieren wir dazu eine entsprechende Enumeration:
Enumeration "Permission" mit den Rechten "Lesen", "Schreiben" und "Löschen"
Als nächstes erstellen wir eine (sehr minimalistische) Benutzer-Klasse, welche eine zu unserer Rechte-Enumeration kompatible Eigenschaft besitzt:
0102030405
public enum Permission { Read, Write, Delete}
Klasse "User" mit Eigenschaft für Benutzerrecht
Jetzt können wir auch schon eine Benutzer-Instanz erzeugen und ein Recht zuweisen, beispielsweise "Lesen":
Das Prinzip entspricht soweit grundsätzlich also dem Vorgehen wie bei jedem anderen Datentypen (→ allgemeinere Informationen) auch. Insbesondere können wir der Eigenschaft 010203040506
public class User { public Permission UserPermission { get; set; }}
UserPermission
z. B. nicht versehentlich einen Wert einer Aufzählung "Farbe" oder "Geschlecht" zuweisen. Nun wäre es noch praktisch, wenn wir auch auf ein spezifisches Benutzerrecht prüfen könnten – also implementieren wir eine entsprechende Methode in der Benutzer-Klasse:
Methode zur Rechteprüfung in "User"
Die Verwendung gestaltet sich nun denkbar einfach (ich schreibe es der Vollständigkeit wegen dennoch auf 010203
public bool CheckPermission(Permission permission) { return (this.UserPermission == permission);}

Rechteprüfung
Soweit können wir glaube ich zufrieden sein. Einen kleinen Schönheitsfehler gibt es jedoch: Wenn wir voraussetzen, dass ein Benutzer mit reinen Schreibrechten noch nichts löschen darf, so müssten wir ihm zwei Rechte zuweisen, wenn er es doch können soll. Wir könnten also eine Rechteliste führen – oder wir bedienen uns der Bitarithmetik und des 0102030405
if(du.CheckPermission(Permission.Write)) { // Recht vorhanden} else { // Recht NICHT vorhanden}
Flags
-Attributs (→ weitere Details zur Verwendung) und bringen beide Rechte in nur einem Feld unter.Dazu passen wir zuerst einmal unsere Aufzählung an, da wir zu diesem Zwecke Zweierpotenzen als Werte benötigen und geben auch gleich das Attribut mit an. Der späteren Bequemlichkeit wegen, erstellen wir auch noch einen weiteren Wert
ReadWrite
, welchen wir mit einem bitweisen ODER aus Read
und Write
definieren:
Enumeration "Permission" mit Attribut und eigenen Werten versehen, sowie Erweiterung um "ReadWrite"
Darüber hinaus müssen wir unsere Prüfmethode geringfügig anpassen:
01020304050607
[Flags]public enum Permission { Read = 1, Write = 2, Delete = 4, ReadWrite = (Read | Write)}
Methode zur Rechteprüfung in "User" erweitern
Nun können wir wieder ein Objekt erzeugen und erhalten die erwarteten Ergebnisse:
010203
public bool CheckPermission(Permission permission) { return ((this.UserPermission & permission) == permission);}
Benutzer mit Rechten erzeugen und prüfen
Eine derartige Vorgehensweise findet auch innerhalb des .NET-Frameworks Verwendung, z. B. bei Dateioperationen mit der Enumeration 01020304050607080910111213
// Benutzer mit Lese- und Schreibrecht erzeugenUser du = new User() { UserPermission = (Permission.Read | Permission.Write) // – oder auch - UserPermission = Permission.ReadWrite};
// Rechte prüfen (einige Beispiele)du.CheckPermission(Permission.Read); // truedu.CheckPermission(Permission.Write); // truedu.CheckPermission(Permission.Delete); // falsedu.CheckPermission(Permission.ReadWrite); // truedu.CheckPermission(Permission.Read | Permission.Delete); // false
FileAccess
.
Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)
Tags
.NET · ADO.NET · Work · ASP.NET MVC · Blog · C# · Generics · Society · Computer Science · Java · LINQ · Logic · Mathematics · Network · PHP · Project · Security · Software development · Studies · Technics · Theory · Web design · WPF