Сокращение названия атрибута C#

Как возможно, что атрибуты C# имеют "Атрибут" на свое имя (например. DataMemberAttribute) но инициализируются без этого суффикса? например:

[DataMember]
private int i;
20
задан John Saunders 27 January 2010 в 10:16
поделиться

3 ответа

Согласно Спецификации языка 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 {}
20
ответ дан 30 November 2019 в 00:35
поделиться

Это конвенция в C # -Compiler. Как будто он говорит на MSDN-странице на «Использование атрибутов» :

по соглашению, все имена атрибутов со словом «атрибут» отличить их от других предметов в .NET Framework. Тем не менее, вы делаете не нужно указывать атрибут Суффикс при использовании атрибутов в коде. Например, [DLLLIMPORT ] эквивалентно к [DLLIMPORTATTRIBUTE] , но DLLIMPORTATTRIBUTE - это атрибут Фактическое имя в .NET Framework.

Это работает так же в VB.Net .

3
ответ дан 30 November 2019 в 00:35
поделиться

Также вы можете использовать

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 {}
7
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: