Обработка целочисленного переполнения является общей задачей, но что лучший способ состоит в том, чтобы обработать его в C#? Там немного синтаксического сахара должно сделать это более простым, чем с другими языками? Или это - действительно лучший способ?
int x = foo();
int test = x * common;
if(test / common != x)
Console.WriteLine("oh noes!");
else
Console.WriteLine("safe!");
Мне не приходилось часто использовать это, но вы можете использовать ключевое слово checked :
int x = foo();
int test = checked(x * common);
При переполнении приведет к исключению времени выполнения. Из MSDN:
В проверенном контексте, если выражение дает значение, которое вне диапазона целевого типа, результат зависит от является ли выражение постоянным или непостоянным. Постоянный выражения вызывают ошибки времени компиляции, в то время как непостоянные выражения оцениваются во время выполнения и вызывают исключения.
Я также должен указать, что есть еще одно ключевое слово C #, unchecked
, которое, конечно, противоположно checked
и игнорирует переполнения. Вы можете задаться вопросом, когда бы вы когда-нибудь использовали без отметки
, поскольку это, по-видимому, поведение по умолчанию. Ну, есть опция компилятора C #, которая определяет, как обрабатываются выражения вне checked
и unchecked
: / checked . Вы можете установить его в расширенных настройках сборки вашего проекта.
Если у вас есть много выражений, которые необходимо проверить, проще всего будет установить параметр сборки / checked
. Тогда любое переполняющееся выражение, если оно не заключено в unchecked
, приведет к исключению времени выполнения.
Лучший способ, как сказал Майкл, - использовать ключевое слово 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());
}
Попробуйте следующее
int x = foo();
try {
int test = checked (x * common);
Console.WriteLine("safe!");
} catch (OverflowException) {
Console.WriteLine("oh noes!");
}
Иногда самый простой способ лучший способ. Я не могу придумать лучшего способа написать то, что вы написали, но вы можете сократить его до:
int x = foo();
if ((x * common) / common != x)
Console.WriteLine("oh noes!");
else
Console.WriteLine("safe!");
Обратите внимание, что я не удалял переменную x
, потому что было бы глупо вызывать foo ()
трижды.