Книга: C# 2008 Programmer

The is and as Operators

The is and as Operators

Performing a direct cast is safe only if you are absolutely sure that the object you are casting implements the particular interface you are trying to assign to. Consider the following case where you have an instance of the Employee class:

Employee e1 = new Employee();

The Employee class implements the IPerson and IAddress interfaces. And so if you try to cast it to an instance of the IManager interface, you will get a runtime error:

//---Error: Invalid cast exception---
IManager m = (IManager) e1;

To ensure that the casting is done safely, use the is operator. The is operator checks whether an object is compatible with a given type. It enables you to rewrite the casting as:

if (m1 is IPerson) {
 IPerson p = (IPerson) m1;
 Console.WriteLine(p.Age());
 Console.WriteLine(p.Name);
 Console.WriteLine(p.DateofBirth);
}
if (m1 is IAddress) {
 IAddress a = (IAddress) m1;
 Console.WriteLine(a.Street);
 Console.WriteLine(a.Zip); Console.WriteLine(a.State());
}
if (e1 is IManager) {
 IManager m = (IManager) e1;
}

Using the is operator means that the compiler checks the type twice — once in the is statement and again when performing the actual casting. So this is actually not very efficient. A better way would be to use the as operator.

The as operator performs conversions between compatible types. Here's the preceding casting rewritten using the as operator:

IPerson p = m1 as IPerson;
if (p != null) {
 Console.WriteLine(p.Age());
 Console.WriteLine(p.Name);
 Console.WriteLine(p.DateofBirth);
}
IAddress a = m1 as IAddress;
if (a != null) {
 Console.WriteLine(a.Street);
 Console.WriteLine(a.Zip);
 Console.WriteLine(a.State());
}
Employee e1 = new Employee();
//---m is null after this statement---
IManager m = e1 as IManager;
if (m != null) {
 //...
}

If the conversion fails, the as operator returns null, so you need to check for null before you actually use the instance of the interface.

Оглавление книги


Генерация: 0.643. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз