Операторы типа

Операторы типа работают не с данными объекта, а с его типом.

typeof

Оператор typeof возвращает тип объекта в виде экземпляра класса System.Type. При использовании этого оператора можно обойтись без создания экземпляра объекта только для того, чтобы получить объект type. Если экземпляр уже существует, для получения объекта type можно вызвать функцию GetType() для экземпляра.

После получения объекта type к нему можно обращаться с запросами для получения информации о типе, используя механизм рефлексии. За дополнительной информацией обращайтесь к разделу «Подробнее о рефлексии» главы 31.

is

Оператор is проверяет, возможно ли преобразование ссылки на объект к определенному типу интерфейса. Чаще всего при помощи этого оператора узнают, поддерживает ли объект некоторый интерфейс:

using System;

interface IAnnoy

{

void PokeSister(string name);

}

class Brother: IAnnoy

{

public void PokeSister(string name)

{

Console.WriteLine("Poking {0}", name);

}

}

class BabyBrother

{

}

class Test

{

public static void AnnoyHer(string sister, params object[] annoyers)

{

foreach (object o in annoyers)

{

if (o is IAnnoy)

{

IAnnoy annoyer = (IAnnoy) o;

annoyer.PokeSister(sister);

}

}

}

public static void Main()

{

Test.AnnoyHer("Jane", new Brother(), new BabyBrother());

}

}

Программа выдает следующий результат:

Poking: Jane

В этом примере интерфейс IAnnoy реализуется классом Brother, но не реализуется классом BabyBrother. Функция AnnoyHer() перебирает все переданные ей объекты, проверяет, поддерживает ли объект интерфейс IAnnoy, и если поддерживает — вызывает для него функцию PokeSister().

as

Оператор as очень похож на оператор is, но он не просто позволяет узнать, можно ли преобразовать объект к некоторому типу или интерфейсу, но и выполняет явное преобразование к этому типу или интерфейсу. Если преобразование объекта невозможно, оператор возвращает null. Оператор as превосходит оператор is по эффективности, поскольку оператору as достаточно проверить тип объекта всего один раз, а в примере с оператором is тип приходится проверять дважды — при использовании оператора и при преобразовании.

В приведенном примере фрагмент:

if (o is IAnnoy)

{

IAnnoy annoyer = (IAnnoy) o;

annoyer.PokeSister(sister);

}

можно заменить следующим:

IAnnoy annoyer = o as IAnnoy;

if (Annoyer != null)

annoyer.PokeSister(sister);

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