checked unchecked

C Sharp > checked unchecked
07.02.2018 12:16:50



Статья:

В C# имеется специальное средство, связанное с генерированием исключений, возникающих при переполнении в арифметических вычислениях. 
Как известно, результаты некоторых видов арифметических вычислений могут превышать диапазон представления чисел для типа данных, 
используемого в вычислении. В этом случае происходит так называемое переполнение.
 
В C# допускается указывать, будет ли в коде сгенерировано исключение при переполнении, с помощью ключевых слов checked и unchecked.
 Так, если требуется указать, что выражение будет проверяться на переполнение, следует использовать ключевое слово checked, 
 а если требуется проигнорировать переполнение — ключевое слово unchecked. В последнем случае результат усекается, чтобы не 
 выйти за пределы диапазона представления чисел для целевого типа выражения.
 
У ключевого слова checked имеются две общие формы. В одной форме проверяется конкретное выражение, и поэтому она 
называется операторной. А в другой форме проверяется блок операторов, и поэтому она называется блочной. Ниже приведены обе формы:
 
checked (выражение)
checked {
// проверяемые операторы
}
где выражение обозначает проверяемое выражение. Если вычисление проверяемого выражения приводит к переполнению, то генерируется исключение OverflowException.
 
У ключевого слова unchecked также имеются две общие формы. В первой, операторной форме переполнение игнорируется при вычислении конкретного выражения. 
А во второй, блочной форме оно игнорируется при выполнении блока операторов:
unchecked (выражение)
unchecked {
// операторы, для которых переполнение игнорируется
}
 
Пример :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            byte a, b, result;
            Console.Write("Введите количество опросов: ");
            int i = int.Parse(Console.ReadLine());
 
            for (int j = 1; j <= i; j++)
            {
                try
                {
                    Console.Write("Введите a: ");
                    // Используем unchecked в одном выражении
                    a = unchecked((byte)int.Parse(Console.ReadLine()));
                    Console.Write("Введите b: ");
                    b = unchecked((byte)int.Parse(Console.ReadLine()));
 
                    // Используем checked для всего блока операторов
                    checked
                    {
                        result = (byte)(a + b);
                        Console.WriteLine("a + b = " + result);
                        result = (byte)(a * b);
                        Console.WriteLine("a*b = " + result + "\n");
                    }
                }
                catch (OverflowException)
                {
                    Console.Write("Переполнение\n\n");
                }
            }
            Console.ReadLine();
        }
    }
}