我有一个Java库,我正在考虑移植到C#。 Java库大量使用注释(在构建时和运行时)。Java注释和C#属性之间有什么异同?
我从来没有使用C#属性,但明白它们大致相当于Java注释。
如果我继续使用属性替换注释的端口,我需要知道什么?什么会是一样的?不同?什么会咬我?
我有一个Java库,我正在考虑移植到C#。 Java库大量使用注释(在构建时和运行时)。Java注释和C#属性之间有什么异同?
我从来没有使用C#属性,但明白它们大致相当于Java注释。
如果我继续使用属性替换注释的端口,我需要知道什么?什么会是一样的?不同?什么会咬我?
Java注释的一个重要方面,我还没有详细看过:您可以编写使用javac中的注释的代码(自Java 6起,我相信)as a form of metaprogramming。
PostSharp允许类似的,诚然。
(这远不是唯一的区别,但它是我所有的时间现在。)
跟进到什么乔恩说...
无论是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)
非常酷的东西... - 斯科特
一个有趣的区别是,C#允许模块和组件级别的属性。这些应用于您的模块或组件,并通过正常方式反射。 Java不提供对jar文件的反射,所以jar级别注释是不可能的。
事实上,这是作为Visual Studio的一个文件中包含根项目级别称为AssemblyInfo.cs
相当常见,例如:
[assembly: AssemblyVersionAttribute("1.2.3.4")]
[assembly: AssemblyTitleAttribute("My project name blah blah")]
...
有一个在爪哇(不等同JAR级别的注释虽然自JDK5,有是一个有点用过的包级别注释机制 - 感谢mmeyers指出这一点)
控制你的元数据访问的时间在两种语言之间是不同的。
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#中默认情况下在运行时可用 - 仅当需要更改时才需要。
虽然我注意到了apt,但我实际上没有使用APT API--我的代码使用反射(和doclet)来完成它的工作(与使用APT在构建期间生成一组中间内容相反) )所以,我想我不关心这个缺失的能力。保持他们的到来:) – Jared 2009-02-16 18:36:08
乔恩 - 只是想要让你知道,在这个问题上有100点奖励 - 如果你有更多时间花更多的时间来给出更完整的答案(并且积分值得) - 我会当然欢迎:)。谢谢! – Jared 2009-03-19 19:02:16
是的,像乔恩真的需要100点赏金:) – ArielBH 2009-03-26 13:25:04