Quelles sont les similitudes et les différences entre les Annotations Java et C# Attributs?
J'ai une bibliothèque Java je suis en train d'étudier le portage en C#. La bibliothèque Java fait un large usage des annotations (à la fois le temps de construction et l'exécution).
Je n'ai jamais utilisé les attributs C#, mais comprendre qu'ils sont l'équivalent d'annotations Java.
Si je continue avec le port à l'aide d'attributs de remplacer les annotations, de quoi ai-je besoin de savoir? Quelle va être la même? Différents? Ce qui va me mordre?
Vous devez vous connecter pour publier un commentaire.
De contrôle sur le moment où vos métadonnées sont accessibles est différente entre les deux langues.
Java fournit la java.lang.annotation.La rétention d'annotation et de java.lang.annotation.RetentionPolicy enum de contrôle lors de l'annotation des métadonnées est accessible. Les choix varient de
Runtime
(cas le plus fréquent - annotation des métadonnées conservées dans les fichiers de classe), àSource
(métadonnées ignorés par le compilateur). Vous tag personnalisé de votre annotation interface avec - par exemple:vous permettra de réfléchir à votre custom
TraceLogging
annotation au moment de l'exécution.C# utilise le ConditionalAttribute attribut qui est piloté à partir de la compilation des symboles. De manière analogue exemple en C# est:
qui entraînerait le compilateur à cracher les métadonnées pour la réalisation de votre
TraceLogging
attribut uniquement si leTRACE
symbole a été défini.NB. attribut de métadonnées est disponible au moment de l'exécution par défaut en C# - ceci n'est nécessaire que si vous souhaitez changer cela.
Un aspect important des annotations Java que je n'ai pas regardé en détail mais: vous pouvez écrire du code qui utilise des annotations dans javac (à compter de la version 6 de Java, je crois) comme une forme de métaprogrammation.
PostSharp permet quelque chose de similaire, certes.
(Qui est loin d'être la seule différence, mais c'est tout ce que j'ai le temps pour l'instant.)
Une différence intéressante est que C# permet de module et de l'assemblée des attributs de niveau. Ceux-ci sont appliqués à votre module ou de l'assemblée et sont disponibles par le biais de la réflexion dans la voie normale. Java ne fournit pas de réflexion sur un fichier jar, de sorte jar niveau annotations ne sont pas possibles.
En fait, c'est assez commun comme Visual Studio un fichier appelé
AssemblyInfo.cs
à la racine du projet niveau qui contient, par exemple:Il n'y a pas d'équivalent jar niveau d'annotation en Java (bien que depuis jdk5, il y a un petit paquet utilisé au niveau de l'annotation mécanisme grâce à mmeyers de remarquer que l'un)
Suivantes jusqu'à ce que Jon a dit...
Java 5 et la version 6 de Java permettent la métaprogrammation. Java 5 utilise un autre outil apt; Java 6 intègre dans le compilateur. (Bien que le Java 5 apt est toujours disponible dans la version 6 de Java)
Malheureusement, chacun utilise une API différente.
Je suis actuellement en utilisant l'API Java 5 pour mon Haricot annotations
Voir http://code.google.com/p/javadude/wiki/Annotations pour un exemple
(NOTE: je suis en train de faire quelques mises à jour majeures, certains de laquelle le changement de l'API.)
Des trucs très cools...
-- Scott