- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Программирование на Visual C++. Архив рассылки - Алекс Jenter
Шрифт:
Интервал:
Закладка:
bool myvalue;
}
Visual Basic.NET
Public Property MyProperty As Boolean
Get
Return Me.myvalue
End Get
Set
Me.myvalue = value
End Set
End Property
Пример пользовательского атрибутаВ этом разделе объединяется вся предыдущая информация и показывается, как создать простой атрибут, документирующий некоторый фрагмент кода. Атрибут из этого примера содержит информацию об имени и уровне программиста, а также о времени последнего пересмотра кода. Он содержит три закрытых переменных, в которых хранятся данные. Каждая переменная связана с открытым свойством для чтения и записи значений. Также имеется конструктор с двумя обязательными параметрами.
C#
[AttributeUsage(AttributeTargets.All)]
public class DeveloperAttribute : System.Attribute {
// Закрытые поля.
private string name;
private string level;
private bool reviewed;
// Конструктор принимает два обязательных параметра: имя и уровень.
public DeveloperAttribute(string name, string level) {
this.name = name;
this.level = level;
this.reviewed = false;
}
// Свойство Name.
// Только для чтения.
public virtual string Name {
get {
return name;
}
}
// Свойство Level.
// Только для чтения.
public virtual string Level {
get {
return level;
}
}
// Свойство Reviewed.
// Чтение / Запись.
public virtual bool Reviewed {
get {
return reviewed;
}
set {
reviewed = value;
}
}
}
MC++
#using <mscorlib.dll>
[AttributeUsage(AttributeTargets::All)]
public __gc class DeveloperAttribute : public System::Attribute {
private:
// Закрытые поля.
String* name;
String* level;
Boolean reviewed;
public:
// Конструктор принимает два обязательных параметра: имя и уровень.
DeveloperAttribute(String* name, String* level) {
this->name = name;
this->level = level;
this->reviewed = false;
}
// Свойство Name.
// Только для чтения.
__property virtual String* get_Name() { return name; }
// Свойство Level.
// Только для чтения.
__property virtual String* get_Level() { return level; }
// Свойство Reviewed.
// Чтение / Запись.
__property virtual Boolean get_Reviewed() { return reviewed; }
__property virtual void set_Reviewed(Boolean value) { reviewed = value; }
}
Visual Basic.NET
Public Class <AttributeUsage(AttributeTargets.All)> DeveloperAttribute
Inherits System.Attribute
' Закрытые поля.
Private name As String
Private level As String
Private reviewed As Boolean
' Конструктор принимает два обязательных параметра: имя и уровень.
Public Sub New(name As String, level As String)
Me.name = name
Me.level = level
Me.reviewed = False
End Sub
' Свойство Name.
' Только для чтения.
Public Overridable ReadOnly Property Name() As String
Get
Return name
End Get
End Property
' Свойство Level.
' Только для чтения.
Public Overridable ReadOnly Property Level() As String
Get
Return level
End Get
End Property
' Свойство Reviewed.
' Чтение / Запись.
Public Overridable Property Reviewed() As Boolean
Get
Return reviewed
End Get
Set
reviewed = value
End Set
End Property
End Class
Применять этот атрибут можно, используя как полное имя DeveloperAttribute, так и сокращенное – Developer:
C#
[Developer("Иван Семенов", "1")]
[Developer("Иван Семенов", "1", Reviewed = true)]
MC++
[Developer(S"Иван Семенов", S"1")]
[Developer(S"Иван Семенов", S"1", Reviewed = true)]
Visual Basic.NET
<Developer("Иван Семенов", "1")>
<Developer("Иван Семенов", "1", Reviewed := True)>
В первом примере показано применение атрибута с одним обязательным параметром, а во втором – с обоими типами параметров.
Доступ к информации, хранящейся в атрибутахТеперь настало время рассмотреть механизм получения атрибутов, ведь мало научиться сохранять свои атрибуты в метаданных, важно еще и уметь получать и использовать их. К счастью, получение пользовательского атрибута – простая задача. Сначала объявляется переменная с типом атрибута, который нужно получить, затем она инициализируется с помощью вызова метода Attribute.GetCustomAttribute. Все, теперь можно использовать любые доступные свойства атрибута.
Получение одиночного атрибутаВ следующем примере атрибут DeveloperAttribute (рассмотренный выше) применяется к классу MainApp в целом. Метод GetAttribute использует Attribyte.GetCustomAttribute для получения состояния атрибута DeveloperAttribute перед тем, как вывести информацию на консоль.
C#
using System;
[Developer("Иван Семенов", "42", Reviewed = true)]
class MainApp {
public static void Main() {
// Вызвать функцию получения и отображения атрибута.
GetAttribute(typeof(MainApp));
}
public static void GetAttribute(Type t) {
// Получить атрибут.
DeveloperAttribute MyAttribute =
(DeveloperAttribute)Attribute.GetCustomAttribute(t, typeof(DeveloperAttribute));
if (MyAttribute == null) {
Console.WriteLine("Атрибут не найден.");
} else {
// Получить поле Имя.
Console.WriteLine("Имя: {0}." , MyAttribute.Name);
// Получить поле Уровень.
Console.WriteLine("Уровень: {0}." , MyAttribute.Level);
// Получить поле Проверено.
Console.WriteLine("Проверено: {0}." , MyAttribute.Reviewed);
}
}
}
MC++
#using <mscorlib.dll> using namespace System;
[Developer(S"Иван Семенов", S"42", Reviewed = true)]
public__gc class MainApp{
public:
static void GetAttribute(Type* t) {
// Получить атрибут.
DeveloperAttribute* MyAttribute =
__try_cast<DeveloperAttribute*>
(Attribute::GetCustomAttribute(t, __typeof(DeveloperAttribute)));
if (MyAttribute == 0)
Console::WriteLine(S"Атрибут не найден.");
else {
// Получить поле Имя.
Console::WriteLine(S"Имя: {0}." , MyAttribute->Name);
// Получить поле Уровень.
Console::WriteLine(S"Уровень: {0}." , MyAttribute->Level);
// Получить поле Проверено.
Console::WriteLine(S"Проверено: {0}." , MyAttribute->Reviewed);
}
}
};
void main() {
// Вызвать функцию получения и отображения атрибута.
MainApp::GetAttribute(__typeof(MainApp));
}
Visual Basic.NET
Imports System
Class <Developer("Иван Семенов", "42", Reviewed := True)> MainApp
Public Shared Sub Main()
' Вызвать функцию получения и отображения атрибута.
GetAttribute(GetType(MainApp))
End Sub
Public Shared Sub GetAttribute(t As Type) ' Получить атрибут.
Dim MyAttribute As DeveloperAttribute = _
CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute)
If MyAttribute Is Nothing Then Console.WriteLine("Атрибут не найден.")
Else ' Получить поле Имя.
Console.WriteLine("Имя: {0}.", MyAttribute.Name) ' Получить поле Уровень.
Console.WriteLine("Уровень: {0}.", MyAttribute.Level) ' Получить поле Проверено.
Console.WriteLine("Проверено: {0}.", MyAttribute.Reviewed)
End If
End Sub
End Class
При запуске эта программа выдает на консоль следующие строки:
Имя: Иван Семенов
Уровень: 42
Проверено: True
Если атрибут не найден, метод GetCustomAttribute возвращает нулевое значение. В этом примере предполагается, что атрибут определен в текущем пространстве имен, если это не так, не забудьте импортировать соответствующее пространство имен.
Получение списка однотипных атрибутовВ предыдущем примере ссылки на класс и атрибут передавались в метод GetCustomAttribute. Этот код прекрасно работает, если на уровне класса определен только один атрибут. Но если на том же уровне определено несколько однотипных атрибутов, этот метод вернет не всю информацию. В таких случаях нужно использовать метод Attribute.GetCustomAttributes, который возвращает массив атрибутов. Например, если на уровне класса определены два экземпляра атрибута DeveloperAttribute, можно модифицировать метод GetAttribute, чтобы получить оба.
Как это сделать, показано в следующем примере: