Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

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

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

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

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

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

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


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Проверка типов в 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.

Популярные статьи по теме
Лучшие срабатывания статического анализатора

Дата: 29 Окт 2021

Автор: Максим Звягинцев

У всех, кто запускал статический анализатор в первый раз на большом проекте, был небольшой шок по поводу сотен, тысяч или даже десятков тысяч предупреждений. Как-то грустно становится после такого. Т…
Зачем нужна техническая поддержка и как в ней не выгореть?

Дата: 01 Сен 2021

Автор: Николай Миронов

Не всем нравится работать в поддержке. Огромное количество людей выгорает на ней. Так может не стоит вообще её иметь? Какую выгоду она несёт? Можно ли как-то не выгорать от поддержки? Попробуем найти…
Как делался новый дизайн сайта PVS-Studio

Дата: 04 Июн 2021

Автор: Инна Пристягина

Сайту PVS-Studio в этом году исполнится 15 лет. Это солидный возраст для любого интернет-ресурса. Далёкий 2006-й в России был признан годом гуманитарных наук. В июне появилась никому не знакомая тогд…
Kanban команды PVS-Studio. Часть 1: agile

Дата: 31 Мар 2021

Автор: Сергей Хренов

Эта статья могла появиться на свет гораздо раньше, примерно на год. Ведь около года назад мы в компании PVS-Studio решили, что пришло время поэкспериментировать с agile. Но хотелось накопить пользова…
Анализатор PVS-Studio включен в реестр отечественного ПО

Дата: 23 Мар 2021

Автор: Евгений Рыжков

PVS-Studio включен в Реестр по Приказу Минцифры России от 18.03.2021 № 156 Приложение № 2, реестровый №9837.

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

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