[Something] 和 [Something Attribute] 有什么区别

What's the difference between [Something] and [SomethingAttribute]

这可能已经有人问过,但很难搜索到。

[Something][SomethingAttribute]有什么区别?

以下两个编译:

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

除了外观之外,它们之间还有什么区别吗?使用它们的一般准则是什么?

没有功能差异。 [Something] 只是 [SomethingAttribute].

的 shorthand 语法

来自MSDN

By convention, all attribute names end with Attribute. However, several languages that target the runtime, such as Visual Basic and C#, do not require you to specify the full name of an attribute. For example, if you want to initialize System.ObsoleteAttribute, you only need to reference it as Obsolete.

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

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

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

大多数 情况下它们是相同的。如前所述,当同时定义了 DefaultValueDefaultValueAttribute 时,通常可以将它们互换使用 except。您可以通过使用逐字标识符 (@).

来使用这两个而不会出现歧义错误

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 或反射时,您需要使用您为类型提供的实际名称。