Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
Проверка типов в C#: typeof, GetType, is

Проверка типов в C#: typeof, GetType, is

30 Сен 2021

Одной из базовых и при том наиболее частых операций работы с типами является их проверка на этапе исполнения. Как для получения информации о типе, так и для его проверки, в разных случаях следует использовать различные методы и операторы. Ниже представлен их краткий обзор.

Оператор typeof

Оператор typeof возвращает экземпляр System.Type, соответствующий типу, имя которого указано в аргументе.

Type typeOfInt = typeof(int);
// [System.Int32]

Type typeOfString = typeof(string);
// [System.String]

Обратите внимание, что в случае с обобщёнными типами оператор typeof может принимать как аргументы сконструированного, так и неограниченного типа.

var typeOfGenericList = typeof(List<>);
// [System.Collections.Generic.List`1[T]]

var typeOfListOfStrings = typeof(List<String>);
// [System.Collections.Generic.List`1[System.String]]

Метод GetType

GetType – экземплярный метод класса Object, который позволяет получить фактический тип объекта на этапе исполнения приложения.

Object obj = new Object();
Object str = String.Empty;

Type type1 = obj.GetType();
// [System.Object]

Type type2 = str.GetType();
// [System.String]

Оператор is

Оператор is позволяет на этапе исполнения проверить, совместим ли тип выражения с указанным в операнде типом.

Object obj = new Object();
Object str = String.Empty;

Console.WriteLine(obj is Object); // True
Console.WriteLine(obj is String); // False

Console.WriteLine(str is Object); // True
Console.WriteLine(str is String); // True

Как видно из этого примера, оператор is проверяет не точное соответствие, а совместимость – то есть то, что фактический тип объекта является указанным или производным от него.

Оператор is обладает и рядом других особенностей, перечисленных ниже.

Проверка на null

Кроме проверки фактического типа, также производится проверка значения на неравенство null.

Object obj = null;
Console.WriteLine(obj is Object); // False, так как obj - null

Проверка упакованного типа

С помощью оператора is можно проверить фактический тип упакованного значения.

Object obj = 42; // boxing

Console.WriteLine(obj is int); // True
Console.WriteLine(obj is double); // False

Проверка нижележащего типа Nullable<T>

Оператор is позволяет проверять, наличие значения в экземпляре Nullable<T> (Nullable<T>.HasValue) и его тип.

int? nullableInt1 = 62;
int? nullableInt2 = null;

Console.WriteLine(nullableInt1 is int?);   // True
Console.WriteLine(nullableInt1 is int);    // True
Console.WriteLine(nullableInt1 is double); // False

Console.WriteLine(nullableInt2 is int?);   // False
Console.WriteLine(nullableInt2 is int);    // False
Console.WriteLine(nullableInt2 is double); // False

Выбор между typeof, GetType, is

Для выбора оператора / метода работы с типами можно использовать следующий подход:

  • для получения экземпляра System.Type по имени типа используйте оператор typeof;
  • если необходима проверка точного соответствие типа, используйте для проверки экземпляр System.Type, полученный через метод GetType;
  • если достаточно проверки совместимости, используйте оператор is.

Более наглядно разница между проверкой типа через метод GetType и оператор is демонстрируется в примере ниже.

class A     { .... }        
class B : A { .... }
class C : B { .... }

void Foo()
{
  A obj = new C();

  Console.WriteLine(obj.GetType() == typeof(B)); // False
  Console.WriteLine(obj is B);                   // True
}

Фактический тип объекта, на который ссылается obj,C. Следовательно, метод GetType для obj возвращает экземпляр System.Type, соответствующий C. Результат работы оператора typeof(B) - экземпляр, описывающий тип B. Сравнение объектов, описывающих разные типы, ожидаемо даёт false.

Оператор is проверяет совместимость, а не точное соответствие. Так как проверяется совместимость объекта типа C с B, результатом будет true.

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам