24

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

4

4 回答 4

30

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

现在将其与object.GetType(). 这将获得它被调用的对象的实际类型。这表示:

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

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

于 2010-12-27T10:15:09.270 回答
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。

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

于 2010-12-27T10:11:44.360 回答
2

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

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

if (typeof(String) == "test".GetType())
于 2010-12-27T10:21:42.063 回答
0

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

IE:

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

((new WebPage1()) is object)是真的,因为(new WebPage1())是类型的对象WebPage1,也是一个Page和一个object

类型可能不同,但会is检查您是否可以安全地转换为这种类型。

于 2010-12-27T12:02:13.410 回答