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

Jar*_*red 46 c# java attributes annotations custom-attributes

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

我从未使用过C#属性,但是要明白它们是Java注释的粗略等价物.

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

ser*_*g10 26

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

Java提供了java.lang.annotation.Retention批注和java.lang.annotation.RetentionPolicy枚举,以控制何时可以访问批注元数据.选择范围从Runtime(最常见的 - 保留在类文件中的注释元数据)到Source(编译器丢弃的元数据).您可以使用此标记自定义注释界面 - 例如:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
public @interface TraceLogging {
  // etc
}
Run Code Online (Sandbox Code Playgroud)

允许您TraceLogging在运行时反映自定义注释.

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

[Conditional("TRACE")]
public class TraceLoggingAttribute : Attribute
{
  // etc
}
Run Code Online (Sandbox Code Playgroud)

这将导致编译器TraceLoggingTRACE在定义符号时吐出自定义属性的元数据.

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

  • +1:保留到运行时对端口很重要.谢谢. (4认同)

Jon*_*eet 15

Java注释的一个重要方面,我还没有详细讨论过:你可以编写使用javac中的注释的代码(我相信Java 6),作为元编程的一种形式.

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

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

  • 是的,就像乔恩真的需要那100点恩惠:) (2认同)

ser*_*g10 12

一个有趣的区别是C#允许模块和汇编级属性. 这些应用于您的模块或组件,并通过正常方式的反射提供.Java不提供jar文件的反射,因此无法进行jar级别的注释.

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

[assembly: AssemblyVersionAttribute("1.2.3.4")]
[assembly: AssemblyTitleAttribute("My project name blah blah")]
...
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上Java中有包级注释:请参阅http://java.sun.com/docs/books/jls/third_edition/html/packages.html#97373. (3认同)