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。)
非常酷的东西 – 斯科特