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