C#属性为什么在名称中包含“Attribute”(例如DataMemberAttribute
),但在初始化时却没有这个后缀?例如:
[DataMember]
private int i;
C#属性为什么在名称中包含“Attribute”(例如DataMemberAttribute
),但在初始化时却没有这个后缀?例如:
[DataMember]
private int i;
Attribute
为后缀。形如type-name的attribute-name可以包含或省略此后缀。attribute-name
的拼写使其最右边的标识符是verbatim identifier,则只匹配不带后缀的属性,从而使这种歧义得到解决。@
前缀的标识符。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 {}
这是同一件事情。 [XAttribute] == [X]
来自MSDN:
按照惯例,所有属性名称都以单词“Attribute”结尾,以区别于.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 {}
X OR X +“Attribute”
来搜索名称。 - serhio