Если вам не нужно приводить, и вам нужно проверить наиболее конкретный (во время выполнения) тип объекта, который быстрее? .GetType () & typeof () или оператор? - PullRequest
1 голос
/ 23 декабря 2019

1) .GetType() вернет тип времени выполнения объекта, для которого он вызывается, который является наиболее конкретным типом в иерархии наследования. Вы можете использовать функцию typeof(), чтобы получить Type для имени класса
2) Оператор is проверит, является ли тип объекта левой стороны подтипом или тот же тип, что и тип, указанный вправая сторона
3) Учитывая, что вам нужно проверить только наиболее конкретный тип объекта, и вам не нужно кастовать, является ли первый (1) значительно быстрее, чем второй (2)?
4)Действительно ли оператор is выполняет приведение и проверку на нулевое значение, или это поведение было изменено в более поздней версии C Sharp?

1 Ответ

3 голосов
/ 23 декабря 2019

typeof(x) - получить объект Type типа Literal, например typeof(int). Это константа времени выполнения.

Для object.GetType() вам нужен экземпляр объекта.

 if (x is IList)

Оператор is выполняет приведение, но возвращает bool в случае успеха или false, если x равен нулюили несовместимый тип. С

 if (x is IList list)

Вы можете одновременно выполнять логический тест и приведение.

Не имеет смысла говорить о производительности, потому что это совершенно разные операции.

если вы хотите получить тип экземпляра объекта object.GetType() - ваш единственный вариант, но вы можете проверить его снова с литералом типа, подобным

 x.GetType() == typeof(List)

Хотя вы можете быть уверены, что

 x.GetType() == typeof(IList)

всегда будет ложным, поскольку GetType никогда не будет возвращать тип интерфейса. Для этого теста вам понадобится

typeof(IList).IsAssignableFrom(x.GetType());
...