和 之间有什么区别?
这可能已经被问到了,但很难找到。
[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。
在大多数情况下,它们是相同的。 如前所述, 除非定义了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
或reflection时,您需要使用您提供类型的实际名称。
两者在属性声明的上下文中是相同的。 前者是后者的较短forms。 但它确实在方法中产生了不同。
例如,如果你在某种方法中说typeof(DefaultValue)
,那将无法编译。 你不得不说typeof(DefaultValueAttribute)
。
private void DoSomething() { var type = typeof(DefaultValue);//Won't compile var type2 = typeof(DefaultValueAttribute);//Does compile }