Операции as и is в C#

Поскольку явное преобразование может потерпеть неудачу с генерацией искл??чения, бывает так, что необходимо проверить тип переменной без выполнения приведения и наблюдения, получится оно или нет.

Проверка типа через приведение утомительна и неэффективна, к тому же исключения дорого обходятся во время выполнения. По этой причине в С# предусмотрены операции, которые приходят на помощь в таких ситуациях и применение которых гарантированно не приведет к исключениям:

• is
• as

Операция is дает в результате булевское значение, говорящее о том, можно ли преобразовать данное выражение в указанный тип, как с помощью преобразования ссылки, так и посредством операций упаковки и распаковки. Например, рассмотрим следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
public class EntryPoint
{
static void Main()  {
String derivedObj = "Dummy";
Object baseObjl = new Object ();
Object baseObj2 = derivedObj;
Console.WriteLine ( "baseObj2 {0} String",
baseObj2 is String ? "является" : "не является" );
Console.WriteLine ( "baseObjl {0} String",
baseObjl is String ? "является" : "не является" );
Console.WriteLine ( "derivedObj {0} Object",
derivedObj is Object ? "является" : "не является" );
int j = 123;
object boxed = j;
object obj = new Object () ;
Console.WriteLine ( "boxed {0} int",
boxed is int ? "является" : "не является" ) ;
Console.WriteLine ( "obj {0} int",
obj is int ? "является" : "не является" );
Console.WriteLine( "boxed {0} System.ValueType",
boxed is ValueType ? "является" : "не является" ) ;
}

Вывод этого кода будет таким:
baseObj2 является String
baseObjl не является String
derivedObj является Object
boxed является int
obj не является int
boxed является System.ValueType

Как уже упоминалось, операция is принимает во внимание только преобразования ссылок. Это значит, что она не может проверять определенные пользователем преобразования, имеющиеся в типах.

Операция as подобна is за исключением того, что она возвращает ссылку на целевой тип. Поскольку гарантируется, что она никогда не сгенерирует исключения, то если данное преобразование невозможно, просто возвращается null-ссылка. Подобно is, операция as принимает во внимание только преобразования ссылок или преобразования с упаковкой/распаковкой.

Например, взгляните на следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
public class BaseType {}
public class DerivedType : BaseType {}
public class EntryPoint
{
static void Main()
{
DerivedType derivedObj = new DerivedType ();
BaseType baseObjl = new BaseType ();
BaseType base0bj2 = derivedObj;
DerivedType derivedObj2 = base0bj2 as DerivedType;
if( derivedObj2 != null ) {
Console.WriteLine ( "Преобразование успешно" );
} else {
Console.WriteLine ( "Преобразование не удалось" );
}
derivedObj2 = baseObjl as DerivedType;
if( derivedObj2 != null )  {
Console.WriteLine ( "Преобразование успешно" );
} else {
Console.WriteLine( "Преобразование не удалось" );
}
BaseType base0bj3 = derivedObj as BaseType;
if ( base0bj3 != null )  {
Console.WriteLine ( "Преобразование успешно" );
} else {
Console.WriteLine ( "Преобразование не удалось" );

Вывод этого кода будет таким:
Преобразование успешно
Преобразование не удалось
Преобразование успешно

Иногда требуется проверить, относится ли переменная к определенному типу, и если да, то выполнить какую-то операцию над нужным типом. Проверить переменную на принадлежность к типу можно с использованием операции is, а затем, если она вернет true, привести переменную к этому типу. Однако это будет не эффективно.

Более удачный подход заключается в том, чтобы следовать идиоме применения операции as для получения ссылки на переменную с нужным типом, а затем проверить ее на неравенство null, что будет означать успешность преобразования.

Таким образом, потребуется выполнить только одну операцию просмотра типа вместо двух.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100