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
сначала проверяется обоснованность операции приведения типов, а затем выполняется сама операция приведения типов, если она допустима.
Несмотря на всю свою полезность, операторы as
и is
проверяют лишь совместимость двух типов. Но зачастую требуется информация о самом типе. Для этой цели в C# предусмотрен оператор typeof
. Он извлекает объект класса System.Туре
для заданного типа. С помощью этого объекта можно определить характеристики конкретного типа данных. Ниже приведена общая форма оператора typeof
:
typeof(тип)
где тип обозначает получаемый тип. Информация, описывающая тип, инкапсулируется в возвращаемом объекте класса Туре
.
Получив объект класса Туре
для заданного типа, можно извлечь информацию о нем, используя различные свойства, поля и методы, определенные в классе Туре
. Класс Туре
довольно обширен и содержит немало членов, поэтому его рассмотрение придется отложить до следующего раздела, посвященного рефлексии. Но в качестве краткого введения в этот класс ниже приведена программа, в которой используются три его свойства: FullName
, IsClass
и IsAbstract
. Для получения полного имени типа служит свойство FullName
. Свойство IsClass
возвращает логическое значение true
, если тип относится к классу. А свойство IsAbstract
возвращает логическое значение true
, если класс является абстрактным.
// Продемонстрировать применение оператора typeof.
using System;
using System.IO;
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
. Затем выводится полное имя этого типа данных и определяется его принадлежность к классу, а далее — к абстрактному или конкретному классу.
Рефлексия
Рефлексия — это средство, позволяющее получать сведения о типе данных. Термин Туре
отражает базовый тип, который он представляет. Для получения информации о типе данных объекту класса Туре
делаются запросы, а он возвращает (отражает) обратно информацию, связанную с определяемым типом. Рефлексия является эффективным механизмом, поскольку она позволяет выявлять и использовать возможности типов данных, известные только во время выполнения.