В чем разница в получении типа с помощью GetType() и typeof()?

Возможный дубликат:
Тип Проверка: typeof, GetType или есть?

Какой из них является предпочтительным способом получения типа?

Ответы

Ответ 1

Вы можете использовать только typeof(), когда вы знаете этот тип во время компиляции, и вы пытаетесь получить соответствующий объект Type. (Хотя тип может быть типичным параметром типа, например typeof(T) в классе с параметром типа T.) Для использования typeof не должно быть экземпляров этого типа. Операнд для typeof всегда является именем параметра типа или типа. Он не может быть переменной или что-то в этом роде.

Теперь сравните это с object.GetType(). Это получит фактический тип объекта, на который он вызвал. Это означает:

  • Вам не нужно знать тип во время компиляции (и обычно это не так)
  • Вам нужно, чтобы это был экземпляр типа (иначе вам нечего было бы называть GetType)
  • Фактический тип не должен быть доступен для вашего кода - например, он может быть внутренним типом в другой сборке

Одна нечетная точка: GetType даст неожиданные ответы на типы значений с нулевым значением из-за того, как работает бокс. Вызов GetType всегда будет включать в себя бокс любого типа значения, включая тип значения с нулевым значением, а значение в квадрате с нулевым типом значений - это либо нулевая ссылка, либо ссылка на экземпляр типа с нулевым значением.

Ответ 2

GetType() работает во время выполнения, typeof() - оператор времени компиляции.

Итак,

// untested, schematic
void ShowType(Object x)
{
   Write(x.GetType().Name);  // depends on actual type
   // typeof(x) won't actually compile
   Write(typeof(x).Name);   // always System.Object
}

ShowType("test");

Будет печатать System.String и System.Object.

См. этот вопрос для лучшего примера.

Ответ 3

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

typeof является оператором С# - это используется для выполнения поиска времени компиляции. i.e. Учитывая символ, представляющий имя класса, извлеките для него объект Type.

if (typeof(String) == "test".GetType())

Ответ 4

Это не совсем то же самое, и проблема возникает, когда вы используете наследование.

I.e.:

WebPage1 наследуется от Page, и этот наследует также от Object, поэтому, если вы проверите для (new WebPage1()).GetType() == typeof(object), он вернет false, потому что типы отличаются друг от друга, но при тестировании с помощью is оператор это правда.

((new WebPage1()) is object) истинно, потому что (new WebPage1()) является объектом типа WebPage1, а также Page и Object.

Типы могут отличаться, но is проверяет, можно ли безопасно этот тип.