当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《JavaAnnotations和C#Attributes之间有什么相似之处和不同之处?》经验,为你挑选了3个好方法。

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

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

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



1> serg10..:

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

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
}

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

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


+1:保留到运行时对端口很重要.谢谢.

2> Jon Skeet..:

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

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

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


是的,就像乔恩真的需要那100点恩惠:)

3> serg10..:

一个有趣的区别是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指出那个)


实际上Java中有包级注释:请参阅http://java.sun.com/docs/books/jls/third_edition/html/packages.html#97373.
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有