Работа с объектами через интерфейсы. Операции is и as

При работе с объектом через объект типа интерфейса бывает необходимо убедить­ся, что объект поддерживает данный интерфейс. Проверка выполняется с помо­щью бинарной операции is. Эта операция определяет, совместим ли текущий тип объекта, находящегося слева от ключевого слова is, с типом, заданным справа. Результат операции равен true, если объект можно преобразовать к заданному типу, и false в противном случае. Операция обычно используется в следующем контексте:

if (объект is тип)

(

// выполнить преобразование "объекта" к "типу"

// выполнить действия с преобразованным объектом

}

Допустим, мы оформили какие-то действия с объектами в виде метода с пара­метром типа object. Прежде чем использовать этот параметр внутри метода для обращения к методам, описанным в производных классах, требуется выполнить преобразование к производному классу. Для безопасного преобразования следу­ет проверить, возможно ли оно, например так:

static void Act(object A)

{

if (A is IAction)

{

IAction Actor = (IAction) A;

Actor.Draw();

}

}

В метод Act можно передавать любые объекты, но на экран будут выведены толь­ко те, которые поддерживают интерфейс IAction.

Недостатком использования операции is является то, что преобразование фак­тически выполняется дважды: при проверке и при собственно преобразовании. Более эффективной является другая операция — as. Она выполняет преобра­зование к заданному типу, а если это невозможно, формирует результат null, например:

static void Act(object A)

{

IAction Actor = A as IAction;

if (Actor!= null)

Actor.Draw():

}

Обе рассмотренные операции применяются как к интерфейсам, так и к классам.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: