Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11276 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 17:

C#. Индексаторы класса и атрибуты

< Лекция 16 || Лекция 17: 1234 || Лекция 18 >

Атрибуты

Язык С# позволяет создавать атрибуты для различных элементов языка, таких как типы, методы, поля и свойства классов. Данные, хранимые в атрибутах, можно запрашивать во время выполнения приложения. Атрибуты - это механизм, позволяющий создавать самоописывающиеся приложения.

Использование атрибутов позволяет получать метаданные периода выполнения.Каждый атрибут - это экземпляр класса, производного от System.Attribute.

Назначаемый типу или члену класса атрибут указывается в квадратных скобках перед типом или членом класса.

Про атрибут, указанный для класса, иногда говорят, что этот атрибут "прикреплен к целевому типу".

Класс Attribute пространства имен System предоставляет следующие члены класса:

  • GetType - получает объект типа Type текущего экземпляра;
  • ToString - возвращает строку, описывающую данный объект;
  • IsDefined - определяет, существует ли атрибуты заданного типа, назначенные указываемому члену класса;
  • GetCustomAttribute - запрашивает атрибут заданного типа для указанного члена класса.

Для класса Attribute определено свойство TypeId, определяющее уникальный идентификатор атрибута.

Назначение атрибута

Для того, чтобы назначить атрибут элементу кода, можно:

  • определить новый класс атрибута
  • использовать существующий класс атрибута из библиотеки NET Framework.

Атрибут указывается в квадратных скобках перед элементом, которому он назначается. Назначаемый атрибут инициализируется вызовом конструктора с соответствующими параметрами.

Класс System.ObsoleteAttribute позволяет помечать код и задавать информацию, которая будет отображаться как Warning во время компиляции приложения. Этот класс предназначается для возможности указания некоторого кода модуля как "устаревшего".Для того чтобы использовать существующий класс для назначаемого методу атрибута, следует:

  1. создать метод, использующий атрибут (например, метод, при каждом вызове которого компилятор будет формировать сообщение Warning с указанным в атрибуте кодом);
  2. ввести перед определением метода в квадратных скобках имя класса атрибута (например, класса ObsoleteAttribute ).

Например:

[ObsoleteAttribute 
("Сообщение, отображаемое 
компилятором как Warning")]
public static void M1( )  {return ;  
//  Компилятор будет выдавать предупреждение при 
// каждом вызове данного метода, которому назначен 
// соответствующий атрибут. Например:
  // c:\c#_project\pr1\class1.cs(23,4): warning 
  // CS0618: 'pr1.Class1.M1()' is obsolete:
  //  'Сообщение, отображаемое компилятором как 
  //   Warning'
}

Язык С# при назначении атрибута позволяет не указывать суффикс Attribute. Так, вместо [ObsoleteAttribute("")] можно записать [Obsolete("")].

Класс атрибута должен иметь хотя бы один public-конструктор.

Создание атрибута

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

Класс атрибута всегда непосредственно или опосредованно наследуется от класса System.Attribute.

Например:

public class MyAttribute : System.Attribute
  {
    public MyAttribute()
    {
    }   }
Параметры атрибута

По умолчанию код класса атрибута содержит конструктор без параметров.Для того чтобы иметь возможность при назначении атрибута сохранять для типа или члена класса некоторые параметры, эти параметры надо задать как параметры конструктора класса атрибута. Параметры атрибута могут объявляться как переменные члены класса.

Для доступа к защищенным переменным членам класса в языке C# используются свойства.

Для создания свойства в среде проектирования VisualStudio.NET можно использовать мастер построения свойства: для этого в окне Class View следует выделить секцию c именем класса и выполнить команду контекстного меню Add|Add Property.

В диалоге C# Property Wizard (рис. 17.2) в поле Property Name следует указать имя создаваемого свойства.

Диалог C# Property Wizard

Рис. 17.2. Диалог C# Property Wizard

Тип создаваемого свойства выбирается из списка Property type.

На панели Accessors переключатели get и set определяют, какие методы-аксессоры будут созданы. Например:

using System;
namespace MyPr1
{
 [AttributeUsage(AttributeTargets.All)]
  public class MyAttribute : System.Attribute
  {
    private string name;  // Используются как
    private int kod;    // параметры атрибута
    public MyAttribute(string name)
    {  // Конструктор
      this.name = name;
      this.kod = 12345; 
    }
            // Свойство Name
    public  string Name
    { get { return name;  } }
            // Свойство Kod
    public  int Kod
    { get { return kod; }
      set {kod=value; }  // Назначение
                       // защищенной переменной члену
               // класса значения параметра
    }
  }
}
// Для назначения некоторому классу данного
// атрибута перед объявлением класса следует
// указать строку типа [My("NameClass", Kod=123)]
< Лекция 16 || Лекция 17: 1234 || Лекция 18 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);