В чем разница в получении типа с помощью 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
проверяет, можно ли безопасно
этот тип.