typeof 在编译时获取类型名对应的 Type 对象,安全高效;GetType() 在运行时通过实例获取实际类型,支持多态但 null 会抛异常。

在 C# 中,typeof 和 GetType() 都用于获取类型信息(即 Type 对象),但它们的工作时机和使用场景有本质区别。理解它们的关键在于:一个是编译时操作,另一个是运行时行为。
typeof 是一个上下文关键字,用于在编译时获取指定类型的 Type 对象。它操作的是类型名称,而不是对象实例。
例如:
Type type = typeof(string); Console.WriteLine(type.Name); // 输出: String
特点:
typeof(int)、typeof(List<string>)</string>)typeof(T)
GetType() 是 Object 类定义的一个实例方法,所有继承自 object 的类型都拥有该方法。它在运行时返回对象的实际类型(即真实类型,可能与声明类型不同)。
例如:
object obj = "Hello"; Type type = obj.GetType(); Console.WriteLine(type.Name); // 输出: String
再看一个多态的例子:
Animal animal = new Dog(); // Dog 继承自 Animal Type type = animal.GetType(); Console.WriteLine(type.Name); // 输出: Dog,而不是 Animal
特点:
NullReferenceException
| 项目 | typeof | GetType() |
|---|---|---|
| 执行时机 | 编译时 | 运行时 |
| 操作目标 | 类型名 | 对象实例 |
| 是否需要实例 | 不需要 | 需要 |
| null 安全性 | 安全(不依赖实例) | 不安全(null 调用会崩溃) |
| 多态支持 | 无(只认写死的类型) | 有(能识别实际类型) |
选择哪一个取决于你的需求:
typeof(T) 仍是编译时操作,但如果 T 是由运行时传入的泛型参数,它的行为会根据实际类型而定(在泛型实例化时确定)。基本上就这些。掌握 typeof 和 GetType() 的差异,有助于写出更准确的反射代码和类型判断逻辑。
以上就是C# typeof和GetType()的区别 - 编译时与运行时的类型信息的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号