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

Pok*_*u22 5 c# .net-attributes

这可能已经被问到了,但很难找到.

[Something]和之间有什么区别[SomethingAttribute]

以下两个编译:

[DefaultValue(false)]
public bool Something { get; set; }
Run Code Online (Sandbox Code Playgroud)
[DefaultValueAttribute(false)]
public bool SomethingElse { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

Fis*_*rdo 7

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

来自MSDN:

按照惯例,所有属性名称都以Attribute结尾.但是,几种以运行时为目标的语言(如Visual Basic和C#)不需要您指定属性的全名.例如,如果要初始化System.ObsoleteAttribute,则只需将其引用为Obsolete.


Jer*_*vel 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 {}
Run Code Online (Sandbox Code Playgroud)

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