使用 GetType() 和 typeof() 获取 Type 有啥区别? [复制]

Posted

技术标签:

【中文标题】使用 GetType() 和 typeof() 获取 Type 有啥区别? [复制]【英文标题】:What is the difference of getting Type by using GetType() and typeof()? [duplicate]使用 GetType() 和 typeof() 获取 Type 有什么区别? [复制] 【发布时间】:2011-05-31 02:12:07 【问题描述】:

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

【问题讨论】:

版主说明:我重新打开并关闭以删除旧的重复通知。请勿将此视为我对副本准确性的认可 【参考方案1】:

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 以获得更好的示例。

【讨论】:

其实typeof不能和实例一起使用,所以typeof(x)不会编译。 @Romain:你说得对,添加了评论。您可以使用通用方法来演示它。 typeof(instance) 不会编译吗?【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

即:

WebPage1 继承自 Page,而这个也继承自 Object,因此如果您测试 (new WebPage1()).GetType() == typeof(object),它将返回 false,因为类型不同,但是当您使用 is 进行测试时运营商是真的。

((new WebPage1()) is object) 为真,因为(new WebPage1())WebPage1 类型的对象,也是Pageobject

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

【讨论】:

以上是关于使用 GetType() 和 typeof() 获取 Type 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c#种GetType()和TypeOf()的区别

何时何地使用 GetType() 或 typeof()? [复制]

C# typeof 与GetType()的区别

Unity3D 灵巧小知识点 ☀️ | GetType和typeof的使用

如果 typeof(Xyz) 存在,为啥 System.Type.GetType("Xyz") 返回 null?

初探反射