我有一个Java库我正在考虑移植到C#。 Java库广泛使用注释(在构建时和运行时。)
我从未使用过C#属性,但明白它们与Java注释大致相同。
如果我使用属性替换注释继续使用端口,我需要知道什么?什么会是一样的?不同?什么会咬我?
答案 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。)
很酷的东西...... - 斯科特