C # проверенный блок - PullRequest
21 голосов
/ 07 марта 2011

Может кто-нибудь объяснить мне, что именно является проверенным и неконтролируемым блоком?
И когда мне следует использовать каждый из них?

Ответы [ 3 ]

37 голосов
/ 07 марта 2011

арифметическое переполнение; например:

int i = int.MaxValue -10;
checked {       
   i+= 20; // boom: OverflowException
           // "Arithmetic operation resulted in an overflow."
}

Так что используйте checked, если вы не хотите, чтобы случайный переполнение / переворачивание было проблемой, и скорее всего будет исключение.

unchecked явно устанавливает режим, разрешающий переполнение; по умолчанию это unchecked, если вы не укажете компилятору иначе - либо с помощью кода (см. выше), либо с помощью переключателя компилятора (/checked в csc).

13 голосов
/ 07 марта 2011

С MSDN

C # операторы могут выполняться в любом проверенный или непроверенный контекст. В проверенный контекст, арифметическое переполнение выдвигает исключение В непроверенном контекст, арифметическое переполнение игнорируется и результат усекается.

Короче говоря, они используются для определения контекста, в котором выполняются арифметические операции. В проверенном контексте выдается исключение при переполнении. В неконтролируемом контексте исключение не генерируется, а значение оборачивается вместо него.

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

Для получения более подробной информации и примеров перейдите по ссылке, указанной выше.

5 голосов
/ 02 апреля 2015

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

Допустим, вы хотите преобразовать значение типа int в значение типа short (называемое сужающим преобразованием).Переменная типа int может иметь диапазон значений от -2 147 483 648 до 2 147 483 647.Но короткие могут иметь только от -32,768 до 32,767.

По этой причине короткая переменная не может иметь все возможные значения, которые может иметь переменная int.Если как, как, можно привести следующий пример:

                int y = 1000000000;
                short x = (short)y;

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

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

        try
        {
            checked
            {
                int y = 1000000000;
                short x = (short)y;
            }
        }
        catch (OverflowException ex)
        {
            MessageBox.Show("hey, we got a overflow/underflow situation");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error");
        }

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

«эй, мы получили ситуацию переполнения / переполнения»

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

...