C# 属性的名称中怎么可能有“Attribute”(例如DataMemberAttribute
) 但初始化时没有这个后缀?例如。:
[DataMember]
private int i;
根据C# 语言规范 http://msdn.microsoft.com/en-us/library/aa664616(VS.71).aspx,
按照约定,属性类以后缀命名Attribute
. An 属性名称形式的类型名称可以包含或省略此后缀。
这是 C# 编译器提供的快捷方式,绝不是 CLR 功能。编译器对属性进行特殊处理的另一个例子是过时属性 http://msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx属性:这个强制一个compiler发出警告/错误,但对于 CLR 来说没有特殊含义。
至于属性是如何解析的,请参见上面的链接。把它们加起来:
如果找到带有或不带有此后缀的属性类,则存在歧义,并导致编译时错误。如果attribute-name
拼写如下,其最右边的标识符是逐字标识符 http://msdn.microsoft.com/en-us/library/aa664670(VS.71).aspx,则仅匹配没有后缀的属性,从而能够解决这种歧义。
“逐字标识符”是带有@
prefix.
继续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
or 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 {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)