Java Annotations和C#Attributes之间有什么相似之处和不同之处?

时间:2009-02-16 16:22:30

标签: c# java attributes annotations custom-attributes

我有一个Java库我正在考虑移植到C#。 Java库广泛使用注释(在构建时和运行时。)

我从未使用过C#属性,但明白它们与Java注释大致相同。

如果我使用属性替换注释继续使用端口,我需要知道什么?什么会是一样的?不同?什么会咬我?

4 个答案:

答案 0 :(得分:25)

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

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
}

只有在定义了TraceLogging符号时,才会导致编译器为自定义TRACE属性吐出元数据。

NB。默认情况下,在C#中,属性元数据在运行时可用 - 只有在您想要更改它时才需要。

答案 1 :(得分:14)

Java注释的一个重要方面我还没有详细讨论过:你可以编写在javac中使用注释的代码(从Java 6开始,我相信)as a form of metaprogramming

PostSharp允许类似的东西,不可否认。

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

答案 2 :(得分:12)

一个有趣的区别是C#允许模块和汇编级别属性。这些属性适用于您的模块或程序集,并且可以通过正常方式反射获得。 Java不提供jar文件的反射,因此无法使用jar级注释。

事实上,作为Visual Studio,在根项目级别调用名为AssemblyInfo.cs的文件非常常见,例如:

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

Java中没有等效的jar级别注释(尽管从jdk5开始,有一些使用的包级别注释机制 - 感谢mmeyers指出那个)#

答案 3 :(得分:3)

继续乔恩所说的......

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

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

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

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

很酷的东西...... - 斯科特