C# 4.0 полное руководство - 2011
Шрифт:
выражение as тип
где выражение обозначает отдельное выражение, преобразуемое в указанный тип. Если исход такого преобразования оказывается удачным, то возвращается ссылка на тип, а иначе — пустая ссылка. Оператор as может использоваться только для преобразования ссылок, идентичности, упаковки, распаковки.
В некоторых
// Использовать оператор is для предотвращения неправильного приведения типов.
using System;
class А {} class В : А {}
class CheckCast {
static void Main {
A a = new A;
В b = new В ;
// Проверить, можно ли привести а к типу В. if(a is В) // если да, то выполнить приведение типов b = (В) а;
else // если нет, то пропустить приведение типов b = null;
if(b==null)
Console.WriteLine("Приведение типов b = (В) HE допустимо."); else
Console.WriteLine("Приведение типов b = (В) допустимо.");
Эта программа дает следующий результат.
Приведение типов b = (В) НЕ допустимо.
Как следует из результата выполнения приведенной выше программы, тип объекта а не совместим с типом В, и поэтому его приведение к типу В не допустимо и предотвращается в условном операторе if. Но такую проверку приходится выполнять в два этапа. Сначала требуется убедиться в обоснованности операции приведения типов, а затем выполнить ее. Оба этапа могут быть объединены в один с помощью оператора as, как демонстрирует приведенная ниже программа.
// Продемонстрировать применение оператора as.
using System;
class A {} class В : A {}
class CheckCast { ,
static void Main {
A a = new A;
В b = new В;
b = a as В; // выполнить приведение типов, если это возможно if(b==null)
Console.WriteLine("Приведение типов b = (В) НЕ допустимо."); else
Console.WriteLine("Приведение типов b = (В) допустимо.");
}
}
Эта программа дает прежний результат.
Приведение типов b = (В) НЕ допустимо.
В данном варианте программы в одном и том же операторе as сначала проверяется обоснованность операции приведения типов, а затем выполняется сама
Применение оператора typeof
Несмотря на всю свою полезность, операторы as и is проверяют лишь совместимость двух типов. Но зачастую требуется информация о самом типе. Для этой цели в C# предусмотрен оператор typeof. Он извлекает объект класса System. Туре для заданного типа. С помощью этого объекта можно определить характеристики конкретного типа данных. Ниже приведена общая форма оператора typeof:
typeof(тип)
где тип обозначает получаемый тип. Информация, описывающая тип, инкапсулируется в возвращаемом объекте класса Туре.
Получив объект класса Туре для заданного типа, можно извлечь информацию о нем, используя различные свойства, поля и методы, определенные в классе Туре. Класс Туре довольно обширен и содержит немало членов, поэтому его рассмотрение придется отложить до следующего раздела, посвященного рефлексии. Но в качестве краткого введения в этот класс ниже приведена программа, в которой используются три его свойства: FullName, IsClass и IsAbstract. Для получения полного имени типа служит свойство FullName. Свойство IsClass возвращает логическое значение true, если тип относится к классу. А свойство IsAbstract возвращает логическое значение true, если класс является абстрактным.
// Продемонстрировать применение оператора typeof.
using System; using System.10;
class UseTypeof {
static void Main {
Type t = typeof(StreamReader);
Console.WriteLine(t.FullName);
if (t.IsClass) Console.WriteLine("Относится к классу."); if (t.IsAbstract) Console.WriteLine("Является абстрактным классом."); else Console.WriteLine("Является конкретным классом.");
}
}
Эта программа дает следующий результат.
System.10.StreamReader Относится к классу.
Является конкретным классом.
В данной программе сначала извлекается объект класса Туре, описывающий тип StreamReader. Затем выводится полное имя этого типа данных и определяется его принадлежность к классу, а далее — к абстрактному или конкретному классу.