我有一个Java库我正在考虑移植到C#.Java库广泛使用注释(在构建时和运行时).
我从未使用过C#属性,但是要明白它们是Java注释的粗略等价物.
如果我使用属性来替换注释继续使用端口,我需要知道什么?什么会是一样的?不同?什么会咬我?
控制何时可以访问元数据在两种语言之间是不同的.
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#中,属性元数据在运行时可用 - 只有在您想要更改它时才需要.
Java注释的一个重要方面,我还没有详细讨论过:你可以编写使用javac中的注释的代码(我相信Java 6),作为元编程的一种形式.
不可否认,PostSharp允许类似的东西.
(这远远不是唯一的区别,但现在我只有时间.)
一个有趣的区别是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指出那个)