В чем разница между [Something] и [SomethingAttribute]
Вероятно, об этом уже спрашивали, но его сложно найти.
В чем разница между [Something]
а также [SomethingAttribute]
?
Обе следующие компиляции:
[DefaultValue(false)]
public bool Something { get; set; }
[DefaultValueAttribute(false)]
public bool SomethingElse { get; set; }
Есть ли различия между ними, кроме их внешнего вида? Каково общее руководство по их использованию?
3 ответа
Там нет функциональной разницы. [Something]
это просто сокращенный синтаксис для [SomethingAttribute]
,
Из MSDN:
По соглашению все имена атрибутов заканчиваются атрибутом. Однако для некоторых языков, предназначенных для среды выполнения, таких как Visual Basic и C#, не требуется указывать полное имя атрибута. Например, если вы хотите инициализировать System.ObsoleteAttribute, вам нужно только сослаться на него как на устаревший.
В большинстве случаев они одинаковы. Как уже говорилось, вы можете использовать их как взаимозаменяемые, за исключением случаев, когда DefaultValue
а также DefaultValueAttribute
определены. Вы можете использовать оба из них без ошибок неоднозначности, используя стенографический идентификатор (@
).
Раздел 17.2 C#LS проясняет это:
[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
или отражение, вам нужно использовать фактическое имя, которое вы дали типу.
Оба одинаковы в контексте объявления атрибутов. Бывший является более короткой формой последнего. Но это делает разницу внутри метода.
Например, если вы говорите typeof(DefaultValue)
в каком-то методе это не скомпилируется. Тебе придется сказать typeof(DefaultValueAttribute)
вместо.
private void DoSomething()
{
var type = typeof(DefaultValue);//Won't compile
var type2 = typeof(DefaultValueAttribute);//Does compile
}