C#面试题更新 2026-08-05

在 C# 编程中,typeof 运算符与 GetType() 方法在获取类型信息时有何不同?请阐述两者各自的用途、适用场景以及它们返回的类型信息有何区别。

技术原理方案权衡C#

考察说明

考察对 C# 类型系统及反射机制中类型获取方式的深入理解,区分编译时与运行时类型信息的获取。

回答思路

  1. 【回答框架 1】typeof 是 C# 运算符,在编译期接受类型名称作为参数,返回对应的 System.Type 对象,代表静态类型,不执行运行时检查。
  2. 【回答框架 2】GetType() 是 Object 类的方法,在运行期通过实例调用,返回该实例的实际运行时类型,用于多态场景下获取对象的真实类型。
  3. 【回答框架 3】两者用途不同:typeof 常用于泛型约束、反射前的类型比较或创建类型对象;GetType() 常用于运行时判断对象具体类型,如类型转换前的检查。
  4. 【回答框架 4】性能上 typeof 在编译时确定,无额外开销;GetType() 涉及虚方法调用,性能略低,但差异在多数场景可忽略。
  5. 【回答框架 5】比较类型时,typeof(T) 与 obj.GetType() 可能不同,特别是基类引用指向派生类对象时,需根据需求选择。
  6. 【关键点 1】typeof 编译时获取静态类型,GetType() 运行时获取实际类型。
  7. 【关键点 2】typeof 参数为类型名,GetType() 通过实例调用。
  8. 【关键点 3】typeof 开销低,GetType() 有虚方法调用开销。
  9. 【关键点 4】比较类型时需考虑继承关系,typeof(基类) 不等于 GetType() 返回派生类类型。
  10. 【关键点 5】GetType() 可用于判断实际类型,常用于类型转换前验证。
  11. 【易错点 1】混淆静态类型与运行时类型,导致类型判断错误。
  12. 【易错点 2】在性能敏感场景中过度使用 GetType(),可能忽略其反射开销。
  13. 【易错点 3】忽略继承关系,直接比较类型导致逻辑缺陷。