Как следует из результата выполнения приведенной выше программы, тип объектаане совместим с типомВ,и поэтому его приведение к типуВне допустимо и предотвращается в условном операторе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);