使用GetType()和typeof()获取Type有什么区别?

时间:2010-12-27 10:10:21

标签: c# .net typeof gettype

  

可能重复:
  Type Checking: typeof, GetType, or is?

获取该类型的首选方法是哪一种?

4 个答案:

答案 0 :(得分:25)

只有在编译时知道该类型,并且您尝试获取相应的typeof()对象时,才能使用Type。 (虽然类型可以是泛型类型参数,例如类型参数为typeof(T)的类中的T。)不需要使用该类型的任何实例{{1} }。 typeof的操作数始终是类型或类型参数的名称。它不能是变量或类似的东西。

现在将其与typeof进行比较。这将获得它被调用的对象的实际类型。这意味着:

  • 您不需要在编译时知道类型(通常也不知道)
  • 需要有一个类型的实例(否则你没有什么可以调用object.GetType()
  • 您的代码无需访问实际类型 - 例如,它可能是不同程序集中的内部类型

奇怪之处:由于拳击的工作方式,GetType会对可空值类型给出意想不到的答案。对GetType的调用将始终涉及装箱任何值类型,包括可空值类型,并且可空值类型的装箱值可以是空引用或对实例的引用不可为空的值类型。

答案 1 :(得分:9)

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。

有关更好的示例,请参阅this question

答案 2 :(得分:2)

GetType是Object上的虚方法 - 这意味着给定一个类的实例,您可以检索相应的Type对象。

typeof是一个C#运算符 - 用于执行编译时查找,即给定一个表示类名的符号,为其检索Type对象。

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

答案 3 :(得分:0)

它不完全相同,使用时会出现问题 继承。

I.e。:

WebPage1继承自Page,而且这个也继承自Object,所以如果你测试(new WebPage1()).GetType() == typeof(object)它会返回false,因为类型不同,但是当你使用is运算符进行测试时,这是真的。

((new WebPage1()) is object)是正确的,因为(new WebPage1())WebPage1类型的对象,还有Pageobject

类型可能不同,但is会检查您是否可以安全地投射到 这种类型。