В других ситуациях бывает полезно узнать, успешно ли завершилось преобразование. Для этого преобразование выполняется в контексте checked:
using System;
class Test
{
public static void Main()
{
checked
{
uint value1 = 312;
byte value2 = (byte) value1;
Console.WriteLine("Value: {0}", value2);
}
}
}
При выполнении явных числовых преобразований в контексте checked, если исходное значение не помещается в результирующем типе данных, инициируется исключение.
Команда checked создает блок, в котором проверяются выполняемые преобразования. Наличие или отсутствие проверки преобразования определяется на стадии компиляции. Проверка не распространяется на код функций, вызванных из блока checked.
Проверка преобразований несколько замедляет работу программы и потому обычно не используется в коммерческих версиях программ. Тем не менее, в процессе разработки программы бывает полезно включить проверку для всех явных числовых преобразований. У компилятора C# существует ключ /checked, генерирующий код проверки для всех явных числовых преобразований. Этот ключ можно применять на стадии разработки программы, однако в коммерческих версиях он обычно не используется для повышения быстродействия программы.
Если потеря данных предусмотрена в работе программы, запуск компилятора с ключом /checked может вызвать проблемы. В этом случае следует воспользоваться командой unchecked; она означает, что преобразования в блоке проверяться не должны.
Иногда бывает удобно разрешить или запретить проверку в одной команде. В таких случаях оператор checked или unchecked ставится в начале выражения:
using System;
class Test
{
public static void Main()
{
uint value1 = 312;
byte value2;
value2 = unchecked((byte) value1); // Никогда не проверяется
value2 = (byte) value1; // Проверяется при вызове
// с ключом /checked
value2 = checked((byte) value1); // Всегда проверяется
}
}
В данном примере первое преобразование не проверяется никогда, второе преобразование проверяется при вызове компилятора с ключом /checked, а третье преобразование проверяется всегда.
0 коммент.:
Отправить комментарий