Атрибут – это тег, который используется для предоставления информации о любом элементе (например, классах, методах, структурах, перечислителях, сборках и т. д.), который используется для.

Синтаксис атрибута

Тег атрибута используется с квадратными скобками «[]» и над элементом, как показано ниже.

[attribute(positional_parameters, name_parameter = value, ...)]
element_which_the_attribute_is_used_for

Как видно из приведенного выше кода, атрибуты могут принимать параметры. Тоже могло не быть.

.Net Framework предоставляет два типа атрибутов: предопределенные атрибуты и специально созданные атрибуты.

Пользовательские атрибуты

Этот тип атрибутов создан нами.

При создании атрибутов имя класса должно заканчиваться значением ключа «Атрибут» и должно наследовать класс атрибута.

Чтобы лучше понять пользовательские атрибуты, которые имеют параметры или нет, давайте создадим класс, который называется Customer, и добавим атрибуты для его свойства и самого себя.

[ToTable("Customers")]
class Customer
{
    public int Id { get; set; }
    [RequiredProperty]
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
}
class RequiredPropertyAttribute : Attribute
{
}
class ToTableAttribute : Attribute
{
    string _tableName;
    // we can also increase the amount of the property of the attribute → [ToTable(1, "Customers")]
    public ToTableAttribute(string tableName)
    {
        _tableName = tableName;
    }
}

Помимо того, что мы можем написать наши атрибуты сами, мы также можем использовать атрибуты, созданные другими и называемые предварительно определенными атрибутами.

Предопределенные атрибуты

Такие атрибуты являются готовыми атрибутами, и .Net Framework предоставляет три предопределенных атрибута;

1. Использование атрибута

*** Прежде чем объяснять атрибут AttributeUsage, обратите внимание, что этот атрибут используется для настраиваемых атрибутов!

AttributeUsage описывает, как можно использовать пользовательский класс атрибутов. Он определяет типы элементов, к которым может применяться атрибут.

Атрибут AttributeUsage имеет 3 параметра, которые он принимает.

[AttributeUsage (
   validon,
   AllowMultiple = allowmultiple,
   Inherited = inherited
)]

Первый из них — это параметр validon, указывающий языковые элементы, на которые может быть помещен атрибут.

[AttributeUsage(AttributeTargets.All)]
public class AttributeClassNameAttribute : Attribute { }

Вышеприведенный атрибут используется для каждого элемента. (=AttributeTargets.All)

[AttributeUsage(AttributeTargets.Class)]
public class AttributeClassNameAttribute : Attribute { }

Приведенный выше атрибут используется для классов. (=Цели атрибутов.Класс)

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field)]
public class AttributeClassNameAttribute : Attribute { }

Приведенный выше атрибут используется для классов и полей. (=AttributeTargets.Class | AttributeTargets.Field) → Вы можете разделить их друг от друга с помощью оператора канала. → |

Второй из них является параметр AllowMultiple (необязательный), предоставляющий значение для свойства AllowMultiple этого атрибута, логическое значение. Если это правда, атрибут является многоразовым. По умолчанию установлено значение false (одноразовое использование).

Может быть, вы спросите, почему нам нужно использовать несколько раз атрибут для элемента. Предположим, что у нас есть класс, который называется Customer, и для этого класса в базе данных могут быть две разные таблицы. В этой ситуации нам, возможно, придется использовать атрибут ToTable для класса два раза, как показано ниже;

[ToTable("Customers")]
[ToTable("TblCustomer")]
class Customer
{ ... }
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
class ToTableAttribute : Attribute
{ ... }

Последним из них является параметр Inherited (необязательный), предоставляющий значение для свойства Inherited этого атрибута, логическое значение. Если это правда, атрибут наследуется производными классами. Значение по умолчанию — false (не наследуется).

2. Устаревший

Когда в классе используется новый метод и вы все еще хотите сохранить старый метод в классе, вы можете пометить его как устаревший, отобразив сообщение о том, что вместо старого метода следует использовать новый метод.

Атрибут Obsolete принимает 2 параметра, которые он принимает;

[Obsolete (
   message,
   iserror
)]

Первый из них — это сообщение параметра, это строка, описывающая причину, по которой элемент устарел, и что использовать вместо него.

Второй из них является параметр iserror (необязательный),являющийся логическим значением. Если его значение равно true, компилятор должен рассматривать использование элемента как ошибку. Значение по умолчанию — false (компилятор выдает предупреждение).

3. Условный

Этот предопределенный атрибут помечает условный метод, выполнение которого зависит от указанного идентификатора предварительной обработки.

Он вызывает условную компиляцию вызовов методов в зависимости от указанного значения, например Debug или Trace. Например, он отображает значения переменных при отладке кода.

Синтаксис для указания этого атрибута следующий;

[Conditional(
   conditionalSymbol
)]

В следующем примере демонстрируется атрибут;

#define DEBUG
using System;
using System.Diagnostics;

public class Myclass {
   [Conditional("DEBUG")] 
   public static void Message(string msg) {
      Console.WriteLine(msg);
   }
}
class Test {
   static void function1() {
      Myclass.Message("In Function 1.");
      function2();
   }
   static void function2() {
      Myclass.Message("In Function 2.");
   }
   public static void Main() {
      Myclass.Message("In Main function.");
      function1();
      Console.ReadKey();
   }
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

In Main function
In Function 1
In Function 2

В результате атрибуты не имеют смысла сами по себе. Они действительно связаны с отражениями. Поэтому я настоятельно рекомендую вам прочитать и мое эссе System.Reflection (вы можете увидеть его, нажав здесь).

Автор: Омер Фарук ЛАЛЕ

Чтобы связаться со мной: https://www.linkedin.com/in/omerlaleee/