Frage
Sind C # Aufzählungen typsicher?
Wenn nicht, was sind die Folgen?
Lösung
eine etwas andere Antwort geben ... während die Werte typsicher aus der Guss Perspektive sind, sind sie noch nicht aktiviert, wenn sie gegossen wurden - d. H
enum Foo { A = 1, B = 2, C = 3 }
static void Main()
{
Foo foo = (Foo)500; // works fine
Console.WriteLine(foo); // also fine - shows 500
}
Aus diesem Grunde sollten Sie darauf achten, die Werte zu überprüfen - z. B. mit einem default
in einem switch
, die eine Ausnahme auslöst
können Sie auch prüfen, die (für Nicht- [Flags]
Werte) über:
bool isValid = Enum.IsDefined(typeof(Foo), foo);
Andere Tipps
Ja, sie sind.
Hier finden Sie http://www.csharp-station.com/Tutorials /Lesson17.aspx
Aufzählungen sind Konstanten stark typisiert. Sie sind im Wesentlichen einzigartige Typen, die Sie symbolische Namen Integralwerte zuweisen lassen. In der C # Tradition, werden sie stark typisiert, was bedeutet, dass eine Enumeration eines Typs nicht implizit auf eine Enumeration eines anderen Typs zugeordnet werden kann, auch wenn der zugrunde liegende Wert ihrer Mitglieder gleich sind. In der gleichen Richtung, sind integrale Typen und Aufzählungen nicht implizit austauschbar. Alle Zuordnungen zwischen verschiedenen Aufzählungstypen und Integraltypen erfordern eine explizite Umwandlung.
Für die, was darauf hindeutet, Enum.IsDefined zu verwenden Argument Validierung zu tun ... nicht! Per Brad Abrams (aus dem Framework-Entwurf Guidlines-Update auf Enum Design ):
Es gibt wirklich zwei Probleme mit Enum.IsDefined (). Zuerst lädt es Reflexion und eine Reihe von Kaltatz Metadaten es ein täuschend teuren Anruf. Zweitens, wie die Note spielt auf gibt es eine Versionierung Problem hier.
Aufzählungen sind Konstanten stark typisiert. Sie sind im Wesentlichen einzigartige Typen, die können Sie einen symbolischen Namen zuzuordnen Integralwert. In der C # Tradition, sie bedeutet stark typisiert, dass eine ENUM eines Typs kann nicht sein, implizit zugewiesen Enum von eine andere Art, auch wenn die zugrunde liegende Wert ihrer Mitglieder das Gleiche. Auf der gleichen Linie, Integral-Typen und Aufzählungen sind nicht implizit austauschbarer. Alle Zuordnungen zwischen verschiedenen Enum Typen und Integraltypen erfordern ein explizite Umwandlung.
Ja.
C #: Enum-Typen:
-A typsichere Aufzählung der genannten Werte.
-Verhindert Programmierfehler
-User können zugrunde liegenden Typ steuern (Standard: int)
-Auch kann die zugrundeliegenden Werte steuern
Technisch nicht, weil Sie eine Enum als Grundwert darstellen können (int, long, etc). Wenn Sie jedoch sicher, dass Sie nur die ENUM durch seine bereitgestellt Namen verwenden, erhalten Sie Zeitfehler kompilieren, wenn Sie den Namen eines Aufzählungswert ändern, ohne seine Referenzen zu aktualisieren. In dieser Hinsicht ja ist es sicher geben.
Ich bin spät zur Party hier, aber ich wollte Extra ein wenig etwas werfen ... Ein Update auf den . NET Framework-Design-Richtlinien von Krzysztof Cwalina. Neben der hervorragenden Spitze oben auf der Prüfung einen gültigen Wert um sicherzustellen, dass auf Ihre Aufzählungen übergeben, stellt diese andere Hinweise und Ratschläge, wie sie effektiv zu nutzen, ein Bündel von gotchas (vor allem beteiligt Flags
Aufzählungen) usw.
ja sie r stark typisierte safed u kann nicht es nicht impilcit convertion von Enum konstanten Variablen integeral Wert macht hv u 2 expilcitly dat tun z.B Enum Tage { Sonne, mon } int e = (int) days.sun; Console.WriteLine (e);
C # Aufzählungen Typ sichere Bedeutung sind
- Sie können von dem zugrunde liegenden Typ der tatsächlichen Enum nicht implizit konvertieren
- Sie können aber auch einen Wert von einer Enum in einer anderen Aufzählungs zuweisen, obwohl die zugrunde liegenden Typen der beiden Aufzählungen gleich sind. Eine explizite Umwandlung ist immer erforderlich.
- Aufzählungen machen Sie Ihren Code lesbarer und wartbar.
Ich habe accross ein exzellentes Video-Tutorial auf Aufzählungen kommen, um ihre Art sichere Art exaplaining. Hier finden Sie aktuelle hier und dort .