我从未使用过 C# 属性,但知道它们大致相当于 Java 注释。
如果我继续使用属性替换注释的端口,我需要知道什么?什么会是一样的?不同的?什么会咬我?
至于我的研究,我发现
C# 使用由编译时符号驱动的ConditionalAttribute属性
我只想知道我们是否可以自己编写注释以及哪些版本的dotnet支持它?
如果我有任何要阅读的样本或文件,我们将不胜感激
等待您的宝贵回复和意见
我从未使用过 C# 属性,但知道它们大致相当于 Java 注释。
如果我继续使用属性替换注释的端口,我需要知道什么?什么会是一样的?不同的?什么会咬我?
至于我的研究,我发现
C# 使用由编译时符号驱动的ConditionalAttribute属性
我只想知道我们是否可以自己编写注释以及哪些版本的dotnet支持它?
如果我有任何要阅读的样本或文件,我们将不胜感激
等待您的宝贵回复和意见
是的,您可以编写自己的属性 - 您只需继承自Attribute
,即
public class FooAttribute : Attribute {
public int Bar {get;set;}
}
然后你可以附上:
[Foo(Bar=12)]
public int X {get;set;}
(另请参阅AttributeUsageAttribute
是否要限制它可以应用于的内容 - 例如类、字段、接口等)
请注意,虽然某些属性(ConditionalAttribute
、ObsoleteAttribute
等)对编译器有意义,但您不能使用属性编写自己的编译时功能,除非通过 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
。
.NET 属性和 Java 注释具有相似的用途。
从 v1.1 开始的所有版本都支持 .NET 中的属性。
有关某些历史的更多详细信息:.NET 属性与 Java 注释:哪个先出现?
是的,您可以在 .NET 中编写自己的属性。(当然,您必须在自己的代码中处理它们 - 否则不会发生任何事情(除非您将现有属性之一子类化以修改它们的行为)。