C#属性如何在其名称中包含“属性”(例如DataMemberAttribute
)但是在没有此后缀的情况下进行初始化? e.g:
[DataMember]
private int i;
答案 0 :(得分:20)
按照惯例,属性类的后缀为
Attribute
。 type-name 形式的属性名称可以包含或省略此后缀。
这是C#编译器提供的快捷方式,绝不是CLR功能。编译器对属性进行特殊处理的另一个例子是ObsoleteAttribute属性:这个强制编译器发出警告/错误,但它对CLR没有特殊意义。
关于如何解析属性,请参阅上面的链接。总结一下:
如果找到带有和不带此后缀的属性类,则会出现歧义,并产生编译时错误。如果拼写
attribute-name
使其最右侧的标识符为verbatim identifier,则只匹配没有后缀的属性,从而可以解决这种歧义。
“逐字标识符”是带有@
前缀的标识符。
继续使用MSDN:
using System;
[AttributeUsage(AttributeTargets.All)]
public class X: Attribute
{}
[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}
[X] // Error: ambiguity
class Class1 {}
[XAttribute] // Refers to XAttribute
class Class2 {}
[@X] // Refers to X
class Class3 {}
[@XAttribute] // Refers to XAttribute
class Class4 {}
属性
[X]
含糊不清,因为它可以引用X
或XAttribute
。使用逐字标识符可以在极少数情况下指定确切的意图。属性[XAttribute]
不含糊不清(尽管有一个名为XAttributeAttribute
的属性类!)。如果删除了类X
的声明,则两个属性都引用名为XAttribute
的属性类,如下所示:
using System;
[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}
[X] // Refers to XAttribute
class Class1 {}
[XAttribute] // Refers to XAttribute
class Class2 {}
[@X] // Error: no attribute named "X"
class Class3 {}
答案 1 :(得分:7)
这是一回事。 [XAttribute] == [X]
来自MSDN:
按照惯例,所有属性名称都以 用“ 属性 ”来代替 将它们与其他物品区分开来 .NET Framework。但是,你这样做 不需要指定属性 在代码中使用属性时的后缀。 例如,
[DllImport]
是等效的 到[DllImportAttribute]
,但DllImportAttribute
是属性的 .NET Framework中的实际名称。
我们也可以阅读:
如果同时找到属性类 有和没有这个后缀,一个 歧义存在,和 编译时错误结果。如果 属性名称拼写如此 它最右边的标识符是 逐字标识符,然后只有一个没有的属性 后缀匹配,从而实现这一点 要解决的含糊不清:
using System;
[AttributeUsage(AttributeTargets.All)]
public class X: Attribute
{}
[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}
[X] // Error: ambiguity
class Class1 {}
[XAttribute] // Refers to XAttribute
class Class2 {}
[@X] // Refers to X
class Class3 {}
[@XAttribute] // Refers to XAttribute
class Class4 {}
答案 2 :(得分:3)
这是C#编译器中的一个约定。就像它在MSDN-page on 'Using Attributes'上所说的那样:
按照惯例,所有属性名称都以 用“属性”一词来表示 将它们与其他物品区分开来 .NET Framework。但是,你这样做 不需要指定属性 在代码中使用属性时的后缀。 例如, [DllImport ]是等效的 到 [DllImportAttribute] ,但是 DllImportAttribute 是属性的 .NET Framework中的实际名称。