Приведение типов в C# с помощью операторов is и as
В C# существуют другие механизмы приведения типов. Например, оператор
is
проверяет совместимость объекта с данным типом, а в качестве результата выдает
значение типа
Boolean
(
true
или
false
). Оператор
is
никогда не генерирует ис-
ключение. Взгляните на следующий код:
Object o = new Object();
Boolean b1 = (o is Object); // b1 равно true
Boolean b2 = (o is Employee); // b2 равно false
127
Приведение.типов
Для
null
-ссылок оператор
is
всегда возвращает
false
, так как объекта, тип
которого нужно проверить, не существует.
Обычно оператор
is
используется следующим образом:
if (o is Employee) {
Employee e = (Employee) o;
// Используем e внутри инструкции if
}
В этом коде CLR по сути проверяет тип объекта дважды: сначала в операторе
is
определяется совместимость
o
с типом
Employee
, а затем в теле оператора
if
анализируется, является ли
o
ссылкой на
Employee
. Контроль типов в CLR укре-
пляет безопасность, но при этом приходится жертвовать производительностью,
так как среда CLR должна выяснять фактический тип объекта, на который ссы-
лается переменная (
o
), а затем проверять всю иерархию наследования на предмет
наличия среди базовых типов заданного типа (
Employee
). Поскольку такая схема
встречается в программировании часто, в C# предложен механизм, повышающий
эффективность кода с помощью оператора
as
:
Employee e = o as Employee;
if (e != null) {
// Используем e внутри инструкции if
}
В этом коде CLR проверяет совместимость
o
с типом
Employee
. Если
o
и
Employee
совместимы,
as
возвращает ненулевой указатель на этот объект, а если нет — опера-
тор
as
возвращает
null
. Заметьте: оператор
as
заставляет CLR верифицировать тип
объекта только один раз, а
if
лишь сравнивает
e
с
null
— такая проверка намного
эффективнее, чем определение типа объекта.
По сути, оператор
as
отличается от оператора приведения типа только тем,
что никогда не генерирует исключение. Если приведение типа невозможно, ре-
зультатом является
null
. Если не сравнить полученный оператором результат
с
null
и попытаться работать с пустой ссылкой, возникнет исключение
System.
NullReferenceException
. Например:
System.Object o = new Object(); // Создание объекта Object
Employee e = o as Employee; // Приведение o к типу Employee
// Преобразование невыполнимо: исключение не возникло, но e равно null
e.ToString(); // Обращение к e вызывает исключение NullReferenceException
Давайте проверим, как вы усвоили материал. Допустим, существуют описания
следующих классов:
internal class B { // Базовый класс
}
internal class D : B { // Производный класс
}
В первом столбце табл. 4.3 приведен код на C#. Попробуйте определить результат
обработки этих строк компилятором и CLR. Если код компилируется и выполняется
128
Do'stlaringiz bilan baham: |