Benutzer mit den meisten Antworten
Erweiterungsmethoden und Enumerations?

Frage
Antworten
-
Hallo zusammen,
ich möchte noch ein paar Dinge zu Thomas Antwort ergänzen:Regeln für das Erstellen einer Erweiterungsmethode:
- Die enthaltene Klasse (in Thomas Beispiel HelperClass) muss als static gekennzeichnet werden.
- Die Erweiterungsmethode selbst muss auch static sein.
- Der 1. Parameter muss von dem Typ sein, der erweitert wird. Dieser Parameter bekommt außerdem den Modifizierer
this.
Da die Methode statisch ist, kann nur über diese Instanz auf die Klasse zugegriffen werden. Man hat auch nach- wie vor nur Zugriff auf die öffentlichen (public) Member der Klasse. private und protected sind nicht verfügbar. - Erweiterungsmethoden sollten sparsam eingesetzt werden. Da sie in dem ganzen Projekt (in dem der Namespace importiert wurde) verfügbar werden, benötigen sie außerdem eine gute Dokumentation.
Hinwiese zu Enums:
- Der Compiler erzeugt einen Fehler, wenn man versucht einen Integer (ganze Zahl) statt einem enum-Wert zu übergeben.
- Durch einen cast wird das aber trotzdem möglich:
Gender g = (Gender)12;
Der Enumerationswert ist in diesem Fall also ungültig, der Compiler wirft aber trotzdem keinen Fehler. Deshalb sollte innerhalb gut geschriebener, öffentlicher Methoden immer auf solche Werte geprüft werden. - Enumerationswerte kann man "mischen". Das hat man häufig bei Enumerationen, die mit API-Zugriffen in Verbindung stehen (also Dateizugriffe usw.). Wenn man einer Enumeration das Flags-Attribut gibt, kann man diese auch mischen:
[Flags] enum Color{ Red, Yellow, Blue, } Color c = Color.Red | Color.Yellow; if(c.HasFlag(Color.Red)){ //c enthält das Flag Color.Red }
PS: Du solltest wirklich versuchen die MSDN zu verstehen. Diese enthält zu jeder Kleinigkeit zig verschiedene Artikel. Mir machen hier eigentlich nichts, außer die MSDN umformuliert wieder zu geben.
Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Aleksander Chalabashiev Montag, 5. Januar 2015 08:45
- Als Antwort markiert Aleksander Chalabashiev Dienstag, 13. Januar 2015 09:23
Alle Antworten
-
Hallo,
wenigstens ist der Titel diesmal besser.
Erweiterungen sind Methoden, die nicht zu einer Klasse gehören, trotzdem aber so verwendet werden, als würden sie dazu gehören:
public class A { private int _a; public int A { get { return _a; } } } public static class HelperClass { //Diese Klasse leitet sich nicht von "A" ab! //Erweiterte Methode public static int DoubleA(this A t) { return t.A * 2; } } //Benutzung A _d = new A(); _d.DoubleA(); //Gehört nicht in de Klasse, wird aber Drangeheftet. //Solche Methoden sind eine andere Schreibweise für HelperClass.DoubleA(_d);
Enumerationen sind gewisse Auswahlmöglichkeiten:
public enum Gender { Male = 1, //Du kannst auch das " = 1" weglassen, der Compüiler gibt automatisch nummern Female = 2, Unknown = 0 //Groß an Conchita Wurst ;) } //Verwendung Gender g = Gender.Male; //Vergleich if(g == Gender.Male) { //Ist Mann } else if(g == Gender.Female) { //Ist Frau } //...
Eigentlich ist das nicht so schwer, oder? Und noch eine Sache, warum es überhaupt Enums gibt. Du kannst damit eine Liste aller Möglichkeiten erstellen, um damit auch sicherzugehen, dass nur eine der Möglichkeiten gewählt wird.
Beispiel: FileMode-Enum
Damit wird sichergestellt, dass nur eine gültige Methode gewählt wird, und nicht eine ungültige. Wer weiß, vielleicht kommt einer ganz kreativ und würde sonst versuchen "Lass mich überraschen" zu wählen...
© 2015 Thomas Roskop
-
Hallo zusammen,
ich möchte noch ein paar Dinge zu Thomas Antwort ergänzen:Regeln für das Erstellen einer Erweiterungsmethode:
- Die enthaltene Klasse (in Thomas Beispiel HelperClass) muss als static gekennzeichnet werden.
- Die Erweiterungsmethode selbst muss auch static sein.
- Der 1. Parameter muss von dem Typ sein, der erweitert wird. Dieser Parameter bekommt außerdem den Modifizierer
this.
Da die Methode statisch ist, kann nur über diese Instanz auf die Klasse zugegriffen werden. Man hat auch nach- wie vor nur Zugriff auf die öffentlichen (public) Member der Klasse. private und protected sind nicht verfügbar. - Erweiterungsmethoden sollten sparsam eingesetzt werden. Da sie in dem ganzen Projekt (in dem der Namespace importiert wurde) verfügbar werden, benötigen sie außerdem eine gute Dokumentation.
Hinwiese zu Enums:
- Der Compiler erzeugt einen Fehler, wenn man versucht einen Integer (ganze Zahl) statt einem enum-Wert zu übergeben.
- Durch einen cast wird das aber trotzdem möglich:
Gender g = (Gender)12;
Der Enumerationswert ist in diesem Fall also ungültig, der Compiler wirft aber trotzdem keinen Fehler. Deshalb sollte innerhalb gut geschriebener, öffentlicher Methoden immer auf solche Werte geprüft werden. - Enumerationswerte kann man "mischen". Das hat man häufig bei Enumerationen, die mit API-Zugriffen in Verbindung stehen (also Dateizugriffe usw.). Wenn man einer Enumeration das Flags-Attribut gibt, kann man diese auch mischen:
[Flags] enum Color{ Red, Yellow, Blue, } Color c = Color.Red | Color.Yellow; if(c.HasFlag(Color.Red)){ //c enthält das Flag Color.Red }
PS: Du solltest wirklich versuchen die MSDN zu verstehen. Diese enthält zu jeder Kleinigkeit zig verschiedene Artikel. Mir machen hier eigentlich nichts, außer die MSDN umformuliert wieder zu geben.
Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Aleksander Chalabashiev Montag, 5. Januar 2015 08:45
- Als Antwort markiert Aleksander Chalabashiev Dienstag, 13. Januar 2015 09:23
-
Hallo Koopakiller,
die Klasse / die Erweiterungsmethode ist doch statisch (static) gekennzeichnet. Ich nehme an, du hast es nur nochmals hervorgehoben, weil es wichtig ist, oder?
Ferner kann man Enumerationen auch noch anders verbinden:
public enum AccessRight { Read = 1, Write = 2, All = AccessRight.Read | AccessRight.Write }
© 2015 Thomas Roskop
-
Hallo Thomas,
deine Antwort ist vollkommen richtig. Ich wollte es nur nochmal hervor heben.Die MSDN enthält wahrscheinlich noch mehr Feinheiten, als uns im Moment einfallen. Das wichtigste dürfte aber genannt worden sein.
Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets