C#属性名称缩写

C#属性如何在其名称中具有“属性”(例如DataMemberAttribute ),但是在没有此后缀的情况下进行初始化? 例如:

 [DataMember] private int i; 

根据C#语言规范 ,

按照惯例,属性类以后缀Attribute命名。 表单类型名称属性 名称可以包含或省略此后缀。

这是C#编译器提供的快捷方式,而不是CLRfunction。 编译器对属性进行特殊处理的另一个例子是ObsoleteAttribute属性:这会强制编译器发出警告/错误,但它对CLR没有特殊意义。

至于如何解析属性,请参阅上面的链接。 把它们加起来:

如果找到带有和不带此后缀的属性类,则会出现歧义,并导致编译时错误。 如果拼写attribute-name使得其最右边的标识符是逐字标识符 ,则仅匹配没有后缀的属性,从而使得能够解决这种不明确性。

“逐字标识符”是具有@前缀的标识符。

继续使用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]是不明确的,因为它可以引用XXAttribute 。 使用逐字标识符可以在极少数情况下指定确切的意图。 属性[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 {} 

这是C#编译器中的一个约定。 就像它在’使用属性’的MSDN页面上所说:

按照惯例,所有属性名称都以单词“Attribute”结尾,以区别于.NET Framework中的其他项。 但是,在代码中使用属性时,不需要指定属性后缀。 例如, [DllImport ]等同于[DllImportAttribute] ,但DllImportAttribute是.NET Framework中属性的实际名称。

它在VB.NET中的工作方式相同 。