这可能已经被问过,但很难搜索。
[Something]
和[SomethingAttribute]
之间的区别是什么?
以下两种编译:
[DefaultValue(false)]
public bool Something { get; set; }
[DefaultValueAttribute(false)]
public bool SomethingElse { get; set; }
除了外观之外,它们之间是否有任何差异?关于其使用的一般准则是什么?
答案 0 :(得分:7)
没有功能差异。 [Something]
只是[SomethingAttribute]
的简写语法。
来自MSDN:
按照惯例,所有属性名称都以Attribute结尾。然而, 几种针对运行时的语言,例如Visual Basic和 C#,不要求您指定属性的全名。对于 例如,如果要初始化System.ObsoleteAttribute,则仅限 需要将其称为过时。
答案 1 :(得分:6)
在大多数情况下,它们是相同的。如前所述,当您同时定义了DefaultValue
和DefaultValueAttribute
时,通常可以使用它们互换除。通过使用逐字标识符(@
),您可以使用这两种方法而不会出现歧义错误。
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
}