C # vs Java Enum (für Neulinge in C #)
Ich habe die Programmierung in Java für eine Weile und habe gerade geworfen auf ein Projekt vollständig geschrieben in C#. Ich bin versucht zu kommen, um die Geschwindigkeit in C#, und bemerkt, Enumerationen, die in verschiedenen Orten in meinem neuen Projekt, aber auf den ersten Blick in C#enums zu sein scheinen, mehr simpel als Java 1.5+ Umsetzung. Kann mir jemand aufzählen der Unterschiede zwischen C# und Java enums, und wie die Unterschiede zu überwinden? (Ich will nicht beginnen, eine Sprache, die Flamme Krieg, ich will einfach nur wissen, wie zu tun, einige Dinge in C#, die ich verwendet, um zu tun, die in Java). Zum Beispiel könnte jemand post ein C# - Pendant zu Sonne, ist der berühmte Planet enum-Beispiel?
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7),
PLUTO (1.27e+22, 1.137e6);
private final double mass; //in kilograms
private final double radius; //in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double mass() { return mass; }
public double radius() { return radius; }
//universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
public double surfaceGravity() {
return G * mass / (radius * radius);
}
public double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
}
//Example usage (slight modification of Sun's example):
public static void main(String[] args) {
Planet pEarth = Planet.EARTH;
double earthRadius = pEarth.radius(); //Just threw it in to show usage
//Argument passed in is earth Weight. Calculate weight on each planet:
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/pEarth.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
//Example output:
$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
[etc ...]
InformationsquelleAutor der Frage Ogre Psalm33 | 2009-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufzählungen, die in der CLR sind einfach benannten Konstanten. Der zugrunde liegende Typ muss integral sein. In Java-eine Aufzählung ist mehr wie eine benannte Instanz eines Typs. Dieser Typ kann sehr Komplex sein und - wie Ihr Beispiel zeigt - mehrere Felder enthalten verschiedene Arten.
Port das Beispiel in C# würde ich nur ändern Sie die enum zu einer immutable-Klasse und setzen static readonly Instanzen dieser Klasse:
InformationsquelleAutor der Antwort Kent Boogaart
In C# können Sie festlegen, erweiterungsmethoden auf Enumerationen, und das macht für einige der fehlenden Funktionen.
Können Sie definieren
Planet
als enum und haben auch Erweiterung Methoden entsprichtsurfaceGravity()
undsurfaceWeight()
.Habe ich verwendet, benutzerdefinierte Attribute, wie vorgeschlagen, durch Michailaber das gleiche kann erreicht werden durch ein Wörterbuch.
InformationsquelleAutor der Antwort finnw
In C# - Attribute können verwendet werden, mit enums. Gutes Beispiel für dieses pattern Programmierung mit detaillierter Beschreibung ist hier (Codeproject)
Edit: diese Frage wurde kürzlich wieder gefragt, und beantwortet von Jon Skeet: Was ist das äquivalent zu Javas enum in C#?
Private innere Klassen in C# - warum sind Sie nicht öfter verwendet?
Edit 2: sehen die akzeptierte Antwort die sich dieser Ansatz in einem sehr geniale Art und Weise!
InformationsquelleAutor der Antwort Mikhail
Java-enums sind doch voll mit Klassen, die einen privaten Konstruktor und Methoden usw., während C# - enums sind nur benannte ganze zahlen. IMO Java-Implementierung ist weit überlegen.
Diese Seite soll Ihnen helfen, eine Menge, während das lernen von c# aus einer java-Lager. (Der link verweist auf die Unterschiede über enums (scroll up /down für andere Dinge)
InformationsquelleAutor der Antwort Richard Walton
Etwas, wie ich denke:
Oder kombinieren Sie die Konstanten in der
Planet
Klasse wie obenInformationsquelleAutor der Antwort
Einer Java-enum ist syntaktischer Zucker zu präsentieren Aufzählungen in ein OO-Weise. Sie sind abstrakte Klassen die Verlängerung der Enum-Klasse in Java, und jeder enum-Wert ist wie ein static final public Instanz die Umsetzung der enum-Klasse. Blick auf die generierten Klassen, und für einen enum "Foo" mit 10 Werten, Sie werden sehen, "Foo" $1" bis "Foo$10" - Klassen generiert.
Weiß ich nicht C#, aber ich kann nur spekulieren, dass eine enum-in dieser Sprache ist mehr wie ein traditionelles enum in C-style Sprachen. Ich sehe aus eine schnelle Google-Suche, dass Sie mehrere Werte aufnehmen kann aber so sind Sie wohl umgesetzt in einer ähnlichen Weise, aber mit viel mehr Einschränkungen als das, was der Java-compiler erlaubt.
InformationsquelleAutor der Antwort JeeBee
Java-enums erlauben eine einfache typesafe Konvertierungen von den Namen über die compiler-generierten valueOf-Methode, D. H.
Äquivalent für ein raw enum in C# ist Ausführlicher:
Jedoch, wenn Sie die route sugegsted von Kent, können Sie die einfache Implementierung von
ValueOf
Methode in der enum-Klasse.InformationsquelleAutor der Antwort serg10
Ich vermute, Enumerationen in C# sind nur Konstanten, die innerhalb der CLR, aber nicht, dass mit Ihnen vertraut. Ich habe dekompiliert einige Klassen in Java und ich kann sagen, Sie wollen Enums sind, sobald Sie Sie konvertieren.
Java macht das etwas hinterhältig. Es behandelt die enum-Klasse wie eine normale Klasse mit, so nah wie ich kann herausfinden, mit viel Makros wenn auf die enum-Werte. Wenn Sie eine case-Anweisung in einer Java-Klasse, die verwendet enums, es ersetzt die enum-Bezüge zu zahlen. Wenn Sie gehen müssen, um string, erstellt er ein array von strings indiziert durch eine Ordnungsposition, die verwendet es in jeder Klasse. Ich vermute, speichern auf Boxen.
Wenn Sie den download dieser decompiler, die Sie erhalten, um zu sehen, wie man es schafft, seine Klasse integriert. Eher faszinierend, ehrlich zu sein. Früher habe ich nicht verwenden Sie die enum-Klasse, weil ich dachte, es war zu aufgebläht für nur ein array von Konstanten. Ich mag es, besser als die begrenzte Art und Weise, die Sie verwenden können, sind Sie in C#.
http://members.fortunecity.com/neshkov/dj.html -- Java decompiler
InformationsquelleAutor der Antwort Paul Bruner
Hier ist eine weitere interessante Idee, die bietet für die benutzerdefinierte Verhalten in Java. Ich kam mit der folgenden
Enumeration
Basisklasse:Er hat einen type-parameter im Grunde nur, damit die Ordnungszahl zählen, ordnungsgemäß, in verschiedenen Enumerationen abgeleitet. Jon Skeet ist
Operator
Beispiel aus seiner Antwort auf eine andere Frage (http://stackoverflow.com/questions/1376312/whats-the-equivalent-of-javas-enum-in-c) oben wird dann:Dies bietet ein paar Vorteile.
string
undint
was macht switch-Anweisungen möglichSystem.Enum
können Hinzugefügt werden, um die Basis-Enumeration-Klasse zu erlauben, die gleiche Funktionalität.InformationsquelleAutor der Antwort Andrew Cooper
Enum in Java ist wesentlich komplexer als C# - enum und daher leistungsfähiger.
Da ist es nur ein weiterer compile-Zeit syntaktischen Zucker ich Frage mich, ob es wirklich Wert war mit inbegriffen, die Sprache angesichts Ihrer begrenzten Verwendung in real-life-Anwendungen.
Manchmal ist es schwieriger, halten Sie Dinge aus, die Sprache als aufzugeben, um den Druck auf eine kleinere Funktion.
InformationsquelleAutor der Antwort dmihailescu
InformationsquelleAutor der Antwort Jim
Konnte man auch mit eine utility-Klasse für jede enum-Typ enthält eine Instanz mit erweiterten Daten für jeden enum-Wert.
InformationsquelleAutor der Antwort djmj