2

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

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

至于我的研究,我发现

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

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

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

等待您的宝贵回复和意见

4

2 回答 2

3

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

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

然后你可以附上:

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

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

请注意,虽然某些属性(ConditionalAttributeObsoleteAttribute等)对编译器有意义,但您不能使用属性编写自己的编译时功能,除非通过 PostSharp 等 3rd 方工具。您可以做的是在运行时通过反射检查属性(特别是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在不支持 WCF via 的平台上不存在DataContractSerializer

于 2012-06-07T05:59:29.860 回答
1

.NET 属性和 Java 注释具有相似的用途。

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

有关某些历史的更多详细信息:.NET 属性与 Java 注释:哪个先出现?

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

于 2012-06-07T06:01:49.467 回答