C#属性名称缩写

时间:2010-01-27 10:03:59

标签: c# .net attributes

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

[DataMember]
private int i;

3 个答案:

答案 0 :(得分:20)

根据C# Language Specification

  

按照惯例,属性类的后缀为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]含糊不清,因为它可以引用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 {}

答案 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中的实际名称。

它有效the same way in VB.NET