Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Ключевые слова checked и unchecked



В С# имеется специальное средство, связанное с генерированием исключений, возникающих при переполнении в арифметических вычислениях. Результаты некоторых видов арифметических вычислений могут превышать диапазон представления чисел для типа данных, используемого в вычислении. В этом случае происходит так называемое переполнение. Рассмотрим в качестве примера следующий фрагмент кода.

byte a, b, result;

а = 127;

Ь = 127;

result = (byte)(a * b);

В этом коде произведение значений переменных а и b превышает диапазон представления чисел для типа byte. Следовательно, результат вычисления данного выражения приводит к переполнению для типа данных, сохраняемого в переменной result.

В С# допускается указывать, будет ли в коде сгенерировано исключение при переполнении, с помощью ключевых слов checked и unchecked. Так, если требуется указать, что выражение будет проверяться на переполнение, следует использовать ключевое слово checked, а если требуется проигнорировать переполнение — ключевое слово unchecked. В последнем случае результат усекается, чтобы не выйти за пределы диапазона представления чисел для целевого типа выражения.

У ключевого слова checked имеются две общие формы. В одной форме проверяется конкретное выражение, и поэтому она называется операторной. А в другой форме проверяется блок операторов, и поэтому она называется блочной. Ниже приведены обе формы:

checked (выражение)

checked {

// проверяемые операторы

}

где выражение обозначает проверяемое выражение. Если вычисление проверяемого выражения приводит к переполнению, то генерируется исключение OverflowException.

У ключевого слова unchecked также имеются две общие формы. В первой, операторной форме переполнение игнорируется при вычислении конкретного выражения. А во второй, блочной форме оно игнорируется при выполнении блока операторов:

unchecked (выражение)

unchecked {

// операторы, для которых переполнение игнорируется

}

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


14. Обобщения (шаблоны) и их применение в языке C#

Обобщения позволяют создавать классы, структуры, интерфейсы, методы и делегаты для обработки разнотипных данных с соблюдением типовой безопасности. Дело в том, что многие алгоритмы очень похожи по своей логике независимо от типа данных, к которым они применяются. Например, механизм, поддерживающий очередь, остается одинаковым независимо от того, предназначена ли очередь для хранения элементов типа int, string, object или для класса, определяемого пользователем. До появления обобщений для обработки данных разных типов приходилось создавать различные варианты одного и того же алгоритма. А благодаря обобщениям можно сначала выработать единое решение независимо от конкретного типа данных, а затем применить его к обработке данных самых разных типов без каких-либо дополнительных усилий.

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

Синтаксис обобщений может быть сведен к общей форме. Ниже приведена общая форма объявления обобщенного класса:

class имя_класса< список_параметров_типа> { //...

А вот как выглядит синтаксис объявления ссылки на обобщенный класс:

имя_класса< список_аргументов_типа> имя_переменной =

new имя_класса< список_параметров_типа> {список_аргументов_конструктора);

Простой пример обобщённого класса и его применение:

using System;

//В приведенном ниже классе Gen параметр типа Т //заменяется реальным типом данных при создании //объекта типа Gen.

class Gen< T> {

Т ob; // объявить переменную типа Т

// у конструктора имеется параметр типа Т.

public Gen(T о) {

ob = о;

}

// Возвратить переменную экземпляра ob, которая //относится к типу Т.

public T GetOb() {

return ob;

}

// Показать тип Т.

public void ShowTypeO {

Console.WriteLine(" К типу Т относится " + typeof(T));

}

}

 

// Применение обобщенного класса,

class GenericsDemo {

static void Main() {

//Создать переменную ссылки на объект Gen типа int.

Gen< int> iOb;

//Создать объект типа Gen< int> и присвоить ссылку на //него переменной iOb.

iOb = new Gen< int> (102);

//Показать тип данных, хранящихся в переменной iOb.

iOb.ShowType();

// Получить значение переменной iOb.

int v = iOb.GetOb();

Console.WriteLine(" Значение: " + v);

Console.WriteLine();

// Создать объект типа Gen для строк.

Gen< string> strOb = new Gen< string> (" Строка." );

//Показать тип данных, хранящихся в переменной //strOb.

strOb.ShowType();

// Получить значение переменной strOb.

string str = strOb.GetOb();

Console.WriteLine(" Значение: " + str);

}

 

Когда для класса указывается аргумент типа, например int или string, то создается так называемый в С# закрыто сконструированный тип. В частности, Gen< int> является закрыто сконструированным типом. Такой обобщенный тип, как Gen< T>, является абстракцией. И только после того, как будет сконструирован конкретный вариант, например Gen< int>, создается конкретный тип. А конструкция, подобная Gen< T>, называется в С# открыто сконструированным типом, поскольку в ней указывается параметр типа Т, но не такой конкретный тип, как int.

В С# чаще определяются такие понятия, как открытый и закрытый типы. Открытым типом считается такой параметр типа или любой обобщенный тип, для которого аргумент типа является параметром типа или же включает его в себя. А любой тип, не относящийся к открытому, считается закрытым. Сконструированным типом считается такой обобщенный тип, для которого предоставлены все аргументы типов. Если все эти аргументы относятся к закрытым типам, то такой тип считается закрыто сконструированным. А если один или несколько аргументов типа относятся к открытым типам, то такой тип считается открыто сконструированным.

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

iOb = strOb; // Неверно!

Несмотря на то что обе переменные, iOb и strOb, относятся к типу Gen< T>, они ссылаются на разные типы, поскольку у них разные аргументы.

В С# также предусмотрены ограниченные типы. Указывая параметр типа, можно наложить определенное ограничение на этот параметр. Это делается с помощью оператора where при указании параметра типа:

class имя_класса< параметр_типа> where параметр_типа: ограничения { //...

где ограничения указываются списком через запятую.

В С# предусмотрен ряд ограничений на типы данных:

1) Ограничение на базовый класс, требующее наличия определенного базового класса в аргументе типа. Это ограничение накладывается указанием имени требуемого базового класса. Разновидностью этого ограничения является неприкрытое ограничение типа, при котором на базовый класс указывает параметр типа, а не конкретный тип. Благодаря этому устанавливается взаимосвязь между двумя параметрами типа.

2) Ограничение на интерфейс, требующее реализации одного или нескольких интерфейсов аргументом типа. Это ограничение накладывается указанием имени требуемого интерфейса.

3) Ограничение на конструктор, требующее предоставить конструктор без параметров в аргументе типа. Это ограничение накладывается с помощью оператора new ().

4) Ограничение ссылочного типа, требующее указывать аргумент ссылочного типа с помощью оператора class.

5) Ограничение типа значения, требующее указывать аргумент типа значения с помощью оператора struct.

В С# разрешается создавать обобщенные структуры. При этом синтаксис для них применяется такой же, как и для обобщенных классов.

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

Ниже приведена общая форма объявления обобщенного метода:

возвращаемый_тип имя_метода< список_параметров_типа> (список_параметров) {//...

список_параметров_типа обозначает разделяемый запятой список параметров типа. В объявлении обобщенного метода список параметров типа следует после имени метода.

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


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 661; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.027 с.)
Главная | Случайная страница | Обратная связь