2009-02-16 61 views
38

我有一个Java库,我正在考虑移植到C#。 Java库大量使用注释(在构建时和运行时)。Java注释和C#属性之间有什么异同?

我从来没有使用C#属性,但明白它们大致相当于Java注释。

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

回答

13

Java注释的一个重要方面,我还没有详细看过:您可以编写使用javac中的注释的代码(自Java 6起,我相信)as a form of metaprogramming

PostSharp允许类似的,诚然。

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

+0

虽然我注意到了apt,但我实际上没有使用APT API--我的代码使用反射(和doclet)来完成它的工作(与使用APT在构建期间生成一组中间内容相反) )所以,我想我不关心这个缺失的能力。保持他们的到来:) – Jared 2009-02-16 18:36:08

+0

乔恩 - 只是想要让你知道,在这个问题上有100点奖励 - 如果你有更多时间花更多的时间来给出更完整的答案(并且积分值得) - 我会当然欢迎:)。谢谢! – Jared 2009-03-19 19:02:16

+2

是的,像乔恩真的需要100点赏金:) – ArielBH 2009-03-26 13:25:04

2

跟进到什么乔恩说...

无论是Java 5和Java 6允许元编程。 Java 5使用独立的apt工具; Java 6将其集成到编译器中。 (尽管Java 5 apt仍然可用于Java 6)

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

我目前使用Java 5 API为我的豆注释

http://code.google.com/p/javadude/wiki/Annotations为例 (注:目前,我正在做一些重大的更新,其中一些改变API)

非常酷的东西... - 斯科特

9

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

事实上,这是作为Visual Studio的一个文件中包含根项目级别称为AssemblyInfo.cs相当常见,例如:

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

有一个在爪哇(不等同JAR级别的注释虽然自JDK5,有是一个有点用过的包级别注释机制 - 感谢mmeyers指出这一点)

21

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

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#中默认情况下在运行时可用 - 仅当需要更改时才需要。

相关问题