Проверяемые преобразования

В других ситуациях бывает полезно узнать, успешно ли завершилось преобразование. Для этого преобразование выполняется в контексте 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, а третье преобразование проверяется всегда.

Предлагаю ознакомиться с аналогичными статьями: