在dotnet中使用注释

时间:2012-06-07 05:55:21

标签: .net c#-4.0 annotations custom-attributes

我从未使用过C#属性,但明白它们与Java注释大致相同。

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

至于我的研究,我发现

  

C#使用从编译时符号驱动的 ConditionalAttribute 属性

我只想知道我们是否可以自己编写注释 哪个版本的dotnet支持它?

如果我有任何样本或文件可供阅读,我们将不胜感激

等待您的宝贵回应和评论

2 个答案:

答案 0 :(得分:3)

是的,您可以编写自己的属性 - 您只需继承自Attribute,即

public class FooAttribute : Attribute {
    public int Bar {get;set;}
}

然后你可以附上那个:

[Foo(Bar=12)]
public int X {get;set;}

(另请参阅AttributeUsageAttribute是否要限制它可以应用的内容 - 例如,类,字段,接口等)

请注意,虽然某些属性(ConditionalAttributeObsoleteAttribute等)对编译器有意义,但不能使用属性编写自己的编译时功能,除非通过第三方工具,如PostSharp。您可以做的是通过反射(特别是Attribute.GetCustomAttribute[s])在运行时检查属性,并相应地对代码作出反应。大多数属性都是通过反射以这种方式使用的。

foreach(var prop in type.GetProperties()) {
    var foo = (FooAttribute)Attribute.GetCustomAttribute(
                        prop, typeof(FooAttribute));
    if(foo != null) {
        Console.WriteLine("{0} has Foo.Bar: {1}", prop.Name, foo.Bar);
    }
}

所有版本的.NET都支持属性,但在某些有限的框架中,如果不需要,您可能会发现某些BCL属性丢失。例如,DataContractAttribute在通过DataContractSerializer不支持WCF的平台上不存在。

答案 1 :(得分:1)

.NET属性和Java注释用于类似目的。

从v1.1开始的所有版本都支持.NET中的属性。

有关某些历史记录的详细信息:.NET Attributes versus Java Annotations: Which Came First?

是的,您可以在.NET中编写自己的属性。 (当然,您必须在自己的代码中处理它们 - 否则什么都不会发生(除非您将其中一个现有属性子类化以修改它们的行为)。