Лучший способ обработать Целочисленное переполнение в C#?

Обработка целочисленного переполнения является общей задачей, но что лучший способ состоит в том, чтобы обработать его в C#? Там немного синтаксического сахара должно сделать это более простым, чем с другими языками? Или это - действительно лучший способ?

int x = foo();
int test = x * common;
if(test / common != x)
    Console.WriteLine("oh noes!");
else
    Console.WriteLine("safe!");
42
задан Ben Lakey 2 June 2010 в 04:13
поделиться

4 ответа

Мне не приходилось часто использовать это, но вы можете использовать ключевое слово checked :

int x = foo();
int test = checked(x * common);

При переполнении приведет к исключению времени выполнения. Из MSDN:

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

Я также должен указать, что есть еще одно ключевое слово C #, unchecked , которое, конечно, противоположно checked и игнорирует переполнения. Вы можете задаться вопросом, когда бы вы когда-нибудь использовали без отметки , поскольку это, по-видимому, поведение по умолчанию. Ну, есть опция компилятора C #, которая определяет, как обрабатываются выражения вне checked и unchecked : / checked . Вы можете установить его в расширенных настройках сборки вашего проекта.

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

102
ответ дан 26 November 2019 в 23:19
поделиться

Лучший способ, как сказал Майкл, - использовать ключевое слово Checked. Это можно сделать как:

int x = int.MaxValue;
try   
{
    checked
    {
        int test = x * 2;
        Console.WriteLine("No Overflow!");
    }
}
catch (OverflowException ex)
{
   Console.WriteLine("Overflow Exception caught as: " + ex.ToString());
}
7
ответ дан 26 November 2019 в 23:19
поделиться

Попробуйте следующее

int x = foo();
try {
  int test = checked (x * common);
  Console.WriteLine("safe!");
} catch (OverflowException) {
  Console.WriteLine("oh noes!");
}
19
ответ дан 26 November 2019 в 23:19
поделиться

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

int x = foo();

if ((x * common) / common != x)
    Console.WriteLine("oh noes!");
else
    Console.WriteLine("safe!");

Обратите внимание, что я не удалял переменную x , потому что было бы глупо вызывать foo () трижды.

4
ответ дан 26 November 2019 в 23:19
поделиться