[Something]和[SomethingAttribute]之间的区别是什么?

时间:2015-02-10 19:59:37

标签: c# .net-attributes

这可能已经被问过,但很难搜索。

[Something][SomethingAttribute]之间的区别是什么?

以下两种编译:

[DefaultValue(false)]
public bool Something { get; set; }
[DefaultValueAttribute(false)]
public bool SomethingElse { get; set; }

除了外观之外,它们之间是否有任何差异?关于其使用的一般准则是什么?

3 个答案:

答案 0 :(得分:7)

没有功能差异。 [Something]只是[SomethingAttribute]的简写语法。

来自MSDN

  

按照惯例,所有属性名称都以Attribute结尾。然而,   几种针对运行时的语言,例如Visual Basic和   C#,不要求您指定属性的全名。对于   例如,如果要初始化System.ObsoleteAttribute,则仅限   需要将其称为过时。

答案 1 :(得分:6)

大多数情况下,它们是相同的。如前所述,当您同时定义了DefaultValueDefaultValueAttribute时,通常可以使用它们互换。通过使用逐字标识符(@),您可以使用这两种方法而不会出现歧义错误。

C#LS第17.2节更清楚:

[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 {}

这是指属性的实际用法。当然,如果您需要使用类型名称,例如使用typeof或反射时,您需要使用您提供类型的实际名称。

答案 2 :(得分:2)

两者在属性声明的上下文中是相同的。前者是后者的较短形式。但它确实在方法中产生了不同。

例如,如果您在某些方法中说typeof(DefaultValue),则无法编译。您必须改为typeof(DefaultValueAttribute)

private void DoSomething()
{
    var type = typeof(DefaultValue);//Won't compile
    var type2 = typeof(DefaultValueAttribute);//Does compile
}