Java注释和C#属性之间的相似之处和区别是什么?

我有一个Java库,我正在考虑移植到C#。 Java库大量使用注释(在构build时和运行时)。

我从来没有使用C#属性,但明白它们是Java注释的大致等价物。

如果我继续使用属性来replace注释,我需要知道什么? 什么是一样的? 不同? 怎么咬我

控制元数据访问的时间在两种语言之间是不同的。

Java提供了java.lang.annotation.Retention注解和java.lang.annotation.RetentionPolicy枚举来控制何时可以访问注释元数据。 这些选项因Runtime (最常见的是保留在类文件中的注释元数据)和Source (编译器丢弃的元数据)而异。 您可以使用这个标签来定制自定义标注界面,例如:

 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.CLASS) public @interface TraceLogging { // etc } 

将允许您在运行时反映您的自定义TraceLogging注释。

C#使用从编译时符号驱动的ConditionalAttribute属性 。 所以C#中的类似例子是:

 [Conditional("TRACE")] public class TraceLoggingAttribute : Attribute { // etc } 

这会导致编译器只有在定义了TRACE符号的情况下才会为您的自定义TraceLogging属性吐出元数据。

NB。 属性元数据在C#中默认情况下在运行时可用 – 只有在需要修改时才需要。

Java注释的一个重要方面,我还没有详细看过:你可以编写代码,使用javac中的注释(我相信从Java 6开始) 作为元编程的一种forms 。

诚然, PostSharp允许类似的东西。

(这是唯一的区别,但我现在有时间了。)

一个有趣的区别是C#允许模块和汇编级别属性。 这些适用于您的模块或组件,并通过正常的方式reflection。 Java不提供对jar文件的reflection,所以jar级别的注释是不可能的。

实际上,在Visual Studio中,在根项目级别上一个名为AssemblyInfo.cs的文件是非常常见的,例如:

 [assembly: AssemblyVersionAttribute("1.2.3.4")] [assembly: AssemblyTitleAttribute("My project name blah blah")] ... 

在Java中没有相当的jar级别的注释(虽然从jdk5开始,有一点用过的包级别注释机制 – 感谢mmeyers指出了这一点)

跟随乔恩说的话

Java 5和Java 6都允许元编程。 Java 5使用一个单独的apt工具; Java 6将其集成到编译器中。 (尽pipeJava 5 apt仍然可以在Java 6中使用)

不幸的是,每个使用不同的API。

我目前正在使用我的Bean注释的Java 5 API

有关示例,请参阅http://code.google.com/p/javadude/wiki/Annotations (注意:我正在进行一些重大更新,其中一些更改了API。)

非常酷的东西 – 斯科特