Was sind die Gemeinsamkeiten und Unterschiede zwischen Java-Annotationen und C# - Attribute?
Ich habe eine Java-Bibliothek, die ich überlege mir, eine Portierung nach C#. Die Java-Bibliothek stellt umfangreiche Verwendung von Anmerkungen (bei beiden build-time und run-time.)
Habe ich noch nie verwendet C# - Attribute, aber Sie verstehen, dass Sie die grobe Entsprechung von Java-Annotationen.
Wenn ich fahren Sie mit dem port, mit Attributen zum ersetzen von Beschriftungen, was muss ich wissen? Was wird gleich sein? Anders? Was wird mich beißen?
InformationsquelleAutor der Frage Jared | 2009-02-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kontrolle über Ihre Metadaten zugänglich gemacht werden, ist der Unterschied zwischen den beiden Sprachen.
Java bietet die java.lang.Anmerkung.Aufbewahrung annotation und java.lang.Anmerkung.RetentionPolicy enum um zu Steuern, Wann die annotation von Metadaten zugänglich ist. Die Möglichkeiten variieren von
Runtime
(die meisten common annotation von Metadaten beibehalten-in-class-Dateien), zumSource
(Metadaten verworfen, durch compiler). Sie tag Ihre benutzerdefinierten annotation-interface, mit diesem - zum Beispiel:erlauben würde, Sie zu reflektieren, Sie auf Ihre benutzerdefinierten
TraceLogging
annotation zur Laufzeit.C# verwendet die ConditionalAttribute Attributdas angetrieben wird von compile-Zeit-Symbole. Also das analoge Beispiel in C#:
die Ursache wäre, dass der compiler spuckte die Metadaten für Ihre benutzerdefinierte
TraceLogging
Attribut nur, wenn dieTRACE
symbol definiert wurde.NB. Attribut-Metadaten zur Laufzeit standardmäßig in C# - dies ist nur erforderlich, wenn Sie das ändern wollen.
InformationsquelleAutor der Antwort serg10
Ist ein wichtiger Aspekt von Java-Annotationen, die ich noch nicht angeschaut im detail noch: Sie können code schreiben, die verwendet Annotationen innerhalb von javac (Java 6, glaube ich) als eine form von metaprogramming.
PostSharp ermöglicht etwas ähnliches, freilich.
(Das ist bei weitem nicht der einzige Unterschied, aber es ist alle ich haben Zeit für jetzt.)
InformationsquelleAutor der Antwort Jon Skeet
Ein interessanter Unterschied ist, dass C# ermöglicht die Modul-und baugruppenebene Attribute. Diese werden angewandt, um das Modul oder Montage übernommen und sind über Reflexion in der üblichen Weise. Java liefert nicht die Reflexion auf eine jar-Datei, damit die jar-level-Annotationen sind nicht möglich.
In der Tat ist dies Recht Häufig, wenn Visual Studio eine Datei namens
AssemblyInfo.cs
auf der root-Ebene des Projekts, die enthält, zum Beispiel:Gibt es keine gleichwertige jar-level annotation in Java (obwohl seit jdk5, es ist ein wenig benutzt-package-level-annotation-Mechanismus - Dank mmeyers für den Hinweis, dass man aus)
InformationsquelleAutor der Antwort serg10
Folgenden bis zu dem, was Jon gesagt...
Java 5 und Java 6 warten metaprogramming. Java 5 verwendet ein separates apt-Werkzeug; Java 6 integriert es in den compiler. (Obwohl die Java-5-apt ist noch in Java 6)
Leider jeder verwendet ein anderes API.
Ich bin derzeit mit der Java 5 API für meine Bohne Anmerkungen
Sehen http://code.google.com/p/javadude/wiki/Annotations für ein Beispiel
(HINWEIS: ich bin derzeit einige wichtige updates, von denen einige ändern die API.)
Sehr Coole Sachen...
-- Scott
InformationsquelleAutor der Antwort Scott Stanchfield