C#属性名称缩写

Fab*_*ano 20 .net c# attributes

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

[DataMember]
private int i;
Run Code Online (Sandbox Code Playgroud)

Ant*_*lev 20

根据C#语言规范,

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

这是C#编译器提供的快捷方式,而不是CLR功能.编译器对属性进行特殊处理的另一个例子是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 {}
Run Code Online (Sandbox Code Playgroud)

属性[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 {}
Run Code Online (Sandbox Code Playgroud)


ser*_*hio 7

这是一回事. [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 {}
Run Code Online (Sandbox Code Playgroud)