关于c#:使用GetType()和typeof()获取Type有什么区别?

What is the difference of getting Type by using GetType() and typeof()?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Type Checking: typeof, GetType, or is?

哪一个是获得类型的首选方法?


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

现在和object.GetType()比较一下。这将得到它调用的对象的实际类型。这意味着:

  • 您不需要在编译时知道类型(通常不知道)
  • 您确实需要该类型的一个实例(否则,您没有任何东西可以调用GetType)。
  • 代码不需要访问实际类型-例如,它可能是其他程序集中的内部类型

有一点很奇怪:由于装箱的工作方式,GetType将对可以为空的值类型给出意外的答案。对GetType的调用将始终涉及装箱任何值类型,包括可以为空的值类型,并且可以为空的值类型的装箱值要么是空引用,要么是对不可以为空的值类型的实例的引用。


getType()在运行时工作,typeof()是编译时运算符。

所以,

1
2
3
4
5
6
7
8
9
// 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。

请参阅此问题以获得更好的示例。


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

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

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

不完全一样,使用时会出现问题继承。

即。:

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

((new WebPage1()) is object)是正确的,因为(new WebPage1())WebPage1类型的对象,也是PageObject类型的对象。

类型可能不同,但如果可以安全地强制转换到这种类型。