我从未使用过C#属性,但明白它们与Java注释大致相同。
如果我使用属性替换注释继续使用端口,我需要知道什么?什么会是一样的?不同?什么会咬我?
至于我的研究,我发现
C#使用从编译时符号驱动的 ConditionalAttribute 属性
我只想知道我们是否可以自己编写注释 哪个版本的dotnet支持它?
如果我有任何样本或文件可供阅读,我们将不胜感激
等待您的宝贵回应和评论
答案 0 :(得分:3)
是的,您可以编写自己的属性 - 您只需继承自Attribute
,即
public class FooAttribute : Attribute {
public int Bar {get;set;}
}
然后你可以附上那个:
[Foo(Bar=12)]
public int X {get;set;}
(另请参阅AttributeUsageAttribute
是否要限制它可以应用的内容 - 例如,类,字段,接口等)
请注意,虽然某些属性(ConditionalAttribute
,ObsoleteAttribute
等)对编译器有意义,但不能使用属性编写自己的编译时功能,除非通过第三方工具,如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中编写自己的属性。 (当然,您必须在自己的代码中处理它们 - 否则什么都不会发生(除非您将其中一个现有属性子类化以修改它们的行为)。