和 之间有什么区别?

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

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

以下两个编译:

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

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

没有function差异。 [Something]只是[Something]的简写语法。

来自MSDN :

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

大多数情况下,它们是相同的。 如前所述, 除非定义了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或reflection时,您需要使用您提供类型的实际名称。

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

例如,如果你在某种方法中说typeof(DefaultValue) ,那将无法编译。 你不得不说typeof(DefaultValueAttribute)

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