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

请阐述 WPF 中 Freezable 类的核心概念与主要用途,并说明在实际开发中应如何创建和使用 Freezable 对象。

风险判断技术原理C#WPF

考察说明

考察对 WPF 中 Freezable 抽象类的理解,包括其冻结机制、线程模型和常见应用场景,以及如何正确使用。

回答思路

  1. 【回答框架 1】Freezable 是 WPF 中一个特殊基类,用于定义可冻结的可变对象。其核心特性是具备两种状态:可变状态与冻结状态。冻结后对象不可再修改,这带来性能优化与线程安全优势,可被多个线程共享使用。
  2. 【回答框架 2】使用 Freezable 对象通常需要创建其派生类实例,并设置所需属性。默认对象处于可变状态。可通过调用 Freeze() 方法冻结对象,同时可用 IsFrozen 属性检查状态。注意:冻结操作必须在对对象完成所有修改后进行,且一旦冻结便无法解冻。
  3. 【回答框架 3】Freezable 常用于 WPF 资源系统,如画笔、画刷、动画和变换等。将资源定义为 Freezable,可以提升性能并支持跨线程共享。此外,Freezable 还支持变更通知,能自动将属性变更传播到绑定目标。
  4. 【回答框架 4】实践中,若需在多个线程中访问同一对象,应先将对象冻结。例如在后台线程创建 Brush 并冻结,再传入 UI 线程使用。若未冻结,则可能导致跨线程访问异常。
  5. 【关键点 1】Freezable 有可变与冻结两种状态,冻结后不可再修改。
  6. 【关键点 2】Freeze() 必须在所有属性设置完成后调用,且不可逆。
  7. 【关键点 3】冻结可带来性能提升与线程安全属性,适合跨线程共享。
  8. 【关键点 4】常见应用包括资源、画笔、动画等。
  9. 【关键点 5】可通过 IsFrozen 属性或调用 CanFreeze() 判断对象是否可冻结。
  10. 【易错点 1】不要尝试在未完全配置对象前冻结,冻结后无法修改,只能重新创建实例。
  11. 【易错点 2】冻结对象虽然线程安全,但冻结过程本身不保证线程安全,应在单线程中创建和冻结,避免竞态。
  12. 【易错点 3】并非所有 Freezable 派生类都能冻结,当存在不可冻结的依赖项时,CanFreeze() 返回 false,需注意处理。