C# 4.0 полное руководство - 2011
Шрифт:
#define TRIAL
using System;
using System.Diagnostics;
class Test {
[Conditional("TRIAL")] void Trial {
Console.WriteLine("Пробная версия, не " +
"предназначенная для распространения.");
[Conditional("RELEASE")] void Release {
Console.WriteLine("Окончательная рабочая версия.");
}
static void Main {
Test t = new Test;
t.Trial; //вызывается
}
}
Эта программа дает следующий результат.
Пробная версия, не предназначенная для распространения.
Рассмотрим эту программу подробнее, чтобы стал понятнее результат ее выполнения. Прежде всего обратите внимание на то, что в этой программе определяется идентификатор TRIAL. Затем обратите внимание на определение методов Trial и Release . Каждому из них предшествует атрибут Conditional, общая форма которого приведена ниже:
[Conditional идентификатор]
где идентификатор обозначает конкретный идентификатор, определяющий условие выполнение метода. Данный атрибут может применяться только к методам. Если идентификатор определен, то метод выполняется, когда он вызывается. Если же идентификатор не определен, то метод не выполняется.
Оба метода, Trial nRelease, вызываются в методе Main . Но поскольку определен один лишь идентификатор TRIAL, то выполняется только метод Trial , тогда как метод Release игнорируется. Если же определить идентификатор RELEASE, то метод Release будет также выполняться. А если удалить определение идентификатора TRIAL, то метод Trial выполняться не будет.
Атрибут Conditional можно также применить в классе атрибута, т.е. в классе, наследующем от класса Attribute. Так, если идентификатор определен, то атрибут применяется, когда он встречается в ходе компиляции. В противном случае он не применяется.
На условные методы накладывается ряд ограничений. Во-первых, они должны возвращать значение типа void, а по существу, ничего не возвращать. Во-вторых, они должны быть членами класса или структуры, а не интерфейса. И в-третьих, они не могут предшествовать ключевому слову override.
Атрибут Obsolete
Атрибут Obsolete (сокращенное
[Obsolete ("сообщение") ] где сообщение выводится при компилировании элемента программы, помеченного как устаревший. Ниже приведен краткий пример применения данного атрибута.
// Продемонстрировать применение атрибута Obsolete, using System; class Test {
[Obsolete("Лучше использовать метод MyMeth2.")] public static int MyMeth(int a, int b) { return a / b;
}
// Усовершенствованный вариант метода MyMeth. public static int MyMeth2(int a, int b) { return b == 0 ? 0 : a /b;
}
static void Main {
// Для этого кода выводится предупреждение.
Console.WriteLine("4 / 3 равно " + Test.MyMeth(4, 3));
//А для этого кода предупреждение не выводится.
Console.WriteLine("4 / 3 равно " + Test.MyMeth2(4, 3));
}
}
Когда по ходу компиляции программы в методе Main встречается вызов метода MyMeth , формируется предупреждение, уведомляющее пользователя о том, что ему лучше воспользоваться методом MyMeth2 .
Ниже приведена вторая форма атрибута Obsolete:
[Obsolete("сообщение", ошибка)]
где ошибка обозначает л отческое значение. Если это значение истинно (true), то при использовании устаревшего элемента формируется сообщение об ошибке компиляции вместо предупреждения. Эта форма отличается тем, что программа, содержащая подобную ошибку, не будет скомпилирована в исполняемом виде.
ГЛАВА 18 Обобщения
Эта глава посвящена обобщениям — одному из самых сложных и эффективных средств С#. Любопытно, что обобщения не вошли в первоначальную версию 1.0 и появились лишь в версии 2.0, но теперь они являются неотъемлемой частью языка С#. Не будет преувеличением сказать, что внедрение обобщений коренным образом изменило характер С#. Это нововведение не только означало появление нового элемента синтаксиса данного языка, но и открыло новые возможности для внесения многочисленных изменений и обновлений в библиотеку классов. И хотя после внедрения обобщений прошло уже несколько лет, последствия этого важного шага до сих пор сказываются на развитии C# как языка программирования.