Java 注释和 C# 属性之间有什么相似之处和不同之处?

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

我从未使用过C#属性,但我知道它们大致相当于Java注释。

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


答案 1

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

Java 提供 java.lang.annotation.Retention annotation 和 java.lang.annotation.RetentionPolicy enum 来控制何时可以访问注释元数据。选择范围从(最常见的 - 保留在类文件中的注释元数据)到(编译器丢弃的元数据)。您可以使用以下命令标记自定义注释界面 - 例如:RuntimeSource

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
public @interface TraceLogging {
  // etc
}

将允许您在运行时反思您的自定义注释。TraceLogging

C# 使用从编译时符号驱动的 ConditionalAttribute 属性。因此,C# 中的类似示例是:

[Conditional("TRACE")]
public class TraceLoggingAttribute : Attribute
{
  // etc
}

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

铌。默认情况下,属性元数据在 C# 中运行时可用 - 仅当要更改它时才需要这样做。


答案 2

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

诚然,PostSharp允许类似的东西。

(这远非唯一的区别,但这是我现在有时间的。