В чем разница между [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
}
Другие вопросы по тегам