рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Checked и unchecked

Checked и unchecked - раздел Программирование, C# Спецификация языка Версия 4.0 Операторы Checked l...

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

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

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

Оператор checked вычисляет содержащееся в нем выражение в проверяемом контексте, а оператор unchecked — в непроверяемом. Выражение_checked или выражение_unchecked в точности соответствует выражению_в_скобках (§7.6.3) за исключением того, что содержащееся выражение вычисляется в указанном контексте проверки переполнения.

Контекстом проверки переполнения также можно управлять с помощью операторов checked и unchecked (§8.11).

Контекст проверки переполнения, заданный с помощью операторов и инструкций checked и unchecked, затрагивает следующие операции.

· Стандартные унарные операторы ++ и -- (§7.6.9 и §7.7.5), когда операнд имеет целый тип.

· Стандартный унарный оператор -- (§7.7.2 и §7.7.2), когда операнд имеет целый тип.

· Стандартные бинарные операторы +, -, *, и / (§7.8), когда оба операнда имеют целый тип.

· Явное числовое преобразование (§6.2.1) из одного целого типа в другой или из типа float или double в целый тип.

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

· В контексте checked если операция является константным выражением (§7.19), возникает ошибка времени компиляции. Иначе, когда операция выполняется во время выполнения, возникает исключение System.OverflowException.

· В контексте unchecked результат усекается путем отбрасывания всех старших битов, которые не помещаются в целевой тип.

Для неконстантных выражений (выражений, которые вычисляются во время выполнения), не заключенных в операторы или инструкции checked или unchecked, контекстом проверки переполнения по умолчанию является unchecked, если внешние факторы (например, переключатели компилятора и конфигурация среды исполнения) не заставляют установить контекст checked.

Для константных выражений (выражений, которые можно полностью вычислить во время компиляции) контекстом проверки переполнения по умолчанию всегда является checked. Если только константное выражение не будет явно помещено в контекст unchecked, переполнения, возникающие при вычислении выражения во время компиляции переполнения, всегда будут вызывать ошибки времени компиляции.

Тело анонимной функции не затрагивается контекстами checked или unchecked, в которых находится анонимная функция.

В примере

class Test
{
static readonly int x = 1000000;
static readonly int y = 1000000;

static int F() {
return checked(x * y); // Throws OverflowException
}

static int G() {
return unchecked(x * y); // Returns -727379968
}

static int H() {
return x * y; // Depends on default
}
}

ошибка времени компиляции не возникает, поскольку ни одно из выражений нельзя вычислить во время компиляции. Во время выполнения метод F вызывает исключение System.OverflowException, а метод G возвращает значение -727379968 (младшие 32 бита результата, выходящего за пределы диапазона). Поведение метода H зависит от контекста проверки переполнения, заданного по умолчанию для компиляции, но оно будет совпадать либо с F, либо с G.

В примере

class Test
{
const int x = 1000000;
const int y = 1000000;

static int F() {
return checked(x * y); // Compile error, overflow
}

static int G() {
return unchecked(x * y); // Returns -727379968
}

static int H() {
return x * y; // Compile error, overflow
}
}

переполнения, возникающие при вычислении константных выражений в F и H, вызывают возникновение ошибок времени компиляции, потому что выражения вычисляются в контексте checked. При вычислении константного выражения в G также может произойти переполнение, но поскольку вычисление выполняется в контексте unchecked, о переполнении не сообщается.

Операторы checked и unchecked влияют на контекст проверки переполнения только для тех операций, которые в текстовом виде заключены между лексемами «(« и «)». Эти операторы не влияют на функции-члены, вызываемые в результате вычисления содержащегося выражения. В примере

class Test
{
static int Multiply(int x, int y) {
return x * y;
}

static int F() {
return checked(Multiply(1000000, 1000000));
}
}

использование checked в F не влияет на вычисление x * y в Multiply, поэтому x * y вычисляется в контексте проверки переполнения по умолчанию.

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

class Test
{
public const int AllBits = unchecked((int)0xFFFFFFFF);

public const int HighBit = unchecked((int)0x80000000);
}

Обе шестнадцатеричные константы выше имеют тип uint. Поскольку константы выходят за пределы диапазона int, без оператора unchecked попытки приведения типа к int будут вызывать ошибки времени компиляции.

Операторы и инструкции checked и unchecked позволяют разработчику управлять определенными аспектами некоторых числовых вычислений. Однако поведение некоторых числовых операторов зависит от типов данных их операндов. Например, умножение двух десятичных чисел всегда приводит к возникновению исключения при переполнении даже внутри явно указанной конструкции unchecked. А умножение двух чисел с плавающей запятой никогда не приводит к возникновению исключения при переполнении даже внутри явно указанной конструкции checked. Кроме того, другие операторы никогда не затрагиваются режимом проверки, заданным явно или по умолчанию.

– Конец работы –

Эта тема принадлежит разделу:

C# Спецификация языка Версия 4.0

Microsoft, Windows, Visual Basic, Visual C# и Visual C++ являются охраняемыми товарными знаками корпорации Майкрософт в США и других странах...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Checked и unchecked

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Pragma warning
Директива #pragma warning используется для о

System.ValueType
Все типы значений неявно наслед

Decimal
Тип decimal представляет собой 128-разряд

Checked и unchecked
Состояние определенного присва

Break, continue и goto
Состояние определенного присва

Try-catch
Для оператора stmt в форме try блок_try catch(...

Try-finally
Для оператора stmt в форме try блок_try finally &

Try-catch-finally
Анализ определенного присваива

Foreach
Для оператора foreach stmt в форме foreach ( неуп

From, let, where, join и orderby
Выражение запроса с вторым пред

Groupby
Выражение запроса вида from x in e group v by k п

Foreach
Оператор foreach осуществляет перечиl

Continue
Оператор continue начинает новую итера

Checked и unchecked
Операторы checked и unchecked используются для

Using alias
Директива_using_alias вводит идентифика&

Using namespace
Директива_using_namespace импортирует типы, &#

Partial
Модификатор partial используется для

Volatile
Если объявление_поля включает м

MoveNext
Метод MoveNext объекта перечислителя и

Current
На свойство Current объекта перечисли

Dispose
Метод Dispose используется для очистк

GetEnumerator
Перечислимый объект предоставл

Partial
Модификатор partial указывает, что объ

System.Array
Тип System.Array является абстрактным базо

Partial
Модификатор partial указывает, что дан

System.Enum
Тип System.Enum — это абстрактный базовый к

System.Exception
Класс System.Exception является базовым типом &

AttributeUsage
Атрибут AttributeUsage используется для опи

Obsolete
Атрибут Obsolete используется для поме

COM и Win32
Исполняющая среда .NET предоставля&

IndexerName
Индексаторы реализованы в .NET с пом

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги