Как возможно, что атрибуты C# имеют "Атрибут" на свое имя (например. DataMemberAttribute
) но инициализируются без этого суффикса? например:
[DataMember]
private int i;
Согласно Спецификации языка C # ,
По соглашению, классы атрибутов именуются суффиксом
Attribute
. имя-атрибута в форме имя-типа может включать или опускать этот суффикс.
Это ярлык, предоставляемый компилятором C #, и ни в коем случае не функция CLR. Другой пример специальной обработки атрибутов компилятором - атрибут ObsoleteAttribute : он заставляет компилятор выдавать предупреждение / ошибку, но не имеет особого значения для CLR.
Относительно того, как разрешаются атрибуты, см. Ссылку выше. Подводя итог:
Если класс атрибута найден как с этим суффиксом, так и без него, возникает неоднозначность и возникает ошибка времени компиляции. Если
имя-атрибута
написано так, что его крайний правый идентификатор является дословным идентификатором , то сопоставляется только атрибут без суффикса, что позволяет разрешить такую неоднозначность.
«Дословный идентификатор» - это идентификатор с префиксом @
.
Продолжение MSDN:
using System;
[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 {}
Атрибут
[X]
неоднозначен, поскольку он может относиться кX
илиXAttribute
. Использование дословного идентификатора позволяет указать точное намерение в таких редких случаях. Атрибут[XAttribute]
не является неоднозначным (хотя это было бы, если бы существовал класс атрибута с именемXAttributeAttribute
!). Если объявление классаX
удалено, то оба атрибута относятся к классу атрибутов с именемXAttribute
следующим образом:
using System;
[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}
[X] // Refers to XAttribute
class Class1 {}
[XAttribute] // Refers to XAttribute
class Class2 {}
[@X] // Error: no attribute named "X"
class Class3 {}
Это конвенция в C # -Compiler. Как будто он говорит на MSDN-странице на «Использование атрибутов» :
по соглашению, все имена атрибутов со словом «атрибут» отличить их от других предметов в .NET Framework. Тем не менее, вы делаете не нужно указывать атрибут Суффикс при использовании атрибутов в коде. Например, [DLLLIMPORT ] эквивалентно к [DLLIMPORTATTRIBUTE] , но DLLIMPORTATTRIBUTE - это атрибут Фактическое имя в .NET Framework.
Это работает так же в VB.Net .
select case when exists (select 1 from table)
then 'contains rows'
else 'doesnt contain rows'
end
или для проверки, если есть дочерние строки для определенной записи:
select * from Table t1
where exists(
select 1 from ChildTable t2
where t1.id = t2.parentid)
или в процедуре
if exists(select 1 from table)
begin
-- do stuff
end
-121--995761- Это то же самое. [Xattribute] == [x]
из MSDN :
по соглашению, все имена атрибутов со словом « атрибут отличить их от других предметов в .NET Framework. Тем не менее, вы делаете не нужно указывать атрибут Суффикс при использовании атрибутов в коде. Например,
[DLLLIMPORT]
эквивалентен к[DLLIMPORTATTRIBUTE]
, ноDLLIMPORTATTRIBUTE
является атрибутом Фактическое имя в .NET Framework.
Мы можем прочитать также:
, если класс атрибута найден оба с и без этого суффикса, двусмысленность присутствует и Результаты ошибок времени компиляции. Если то атрибут-имя написано так, что его правый идентификатор является Вербатим идентификатор, то только атрибут без Суффикс соответствует таким образом, что позволяет таким образом двусмысленность должна быть решена:
using System;
[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 {}