C#中HybridObject引用置空不生效问题求助(附代码)
问题分析
你当前的代码里,HybridObject是引用类型,Application中的obj保存的是new HybridObject()实例的直接引用(因为Core初始返回实例自身)。调用obj.Delete()只会把实例内部的core字段设为null,但obj本身的引用依然指向原来的实例,所以obj == null永远不会成立。
解决方案
方案一:通过事件通知销毁
给HybridObject添加销毁事件,让Application订阅这个事件,在触发时主动置空obj:
using System.Threading; public class Application { HybridObject obj; public Application() { var hybridInstance = new HybridObject(); obj = hybridInstance.Core; // 订阅销毁事件,触发时把obj置空 hybridInstance.Destroyed += () => obj = null; obj.Delete(); while (true) { Update(); Thread.Sleep(1000); // 加延迟避免输出刷屏 } } void Update() { if (obj == null) Console.WriteLine("Destroyed"); // 现在会正常触发 if (obj?.Core == null) Console.WriteLine("Destroyed Core"); // 加空引用保护,防止obj为null时报错 } } public class HybridObject { protected HybridObject core; public HybridObject Core => core; // 定义销毁事件 public event Action Destroyed; public HybridObject() { core = this; } public void Delete() { core = null; // 触发销毁事件,通知外部订阅者 Destroyed?.Invoke(); } }
方案二:使用引用包装类
创建一个通用的包装类来持有HybridObject的引用,这样修改包装类内部的值时,外部的包装实例能直接感知到:
using System.Threading; public class RefWrapper<T> where T : class { public T Value { get; set; } public RefWrapper(T value) => Value = value; } public class Application { RefWrapper<HybridObject> objWrapper; public Application() { var hybridInstance = new HybridObject(); objWrapper = hybridInstance.CoreWrapper; objWrapper.Value.Delete(); while (true) { Update(); Thread.Sleep(1000); } } void Update() { if (objWrapper.Value == null) Console.WriteLine("Destroyed"); // 现在会正常触发 if (objWrapper.Value?.Core == null) Console.WriteLine("Destroyed Core"); } } public class HybridObject { protected HybridObject core; public HybridObject Core => core; // 暴露包装类实例 public RefWrapper<HybridObject> CoreWrapper { get; } public HybridObject() { core = this; CoreWrapper = new RefWrapper<HybridObject>(this); } public void Delete() { core = null; // 同时置空包装类里的引用 CoreWrapper.Value = null; } }
方案说明
- 方案一:通过事件解耦,外部代码只需订阅销毁事件即可同步更新引用,适合大多数简单场景。
- 方案二:通过包装类统一管理引用,适合需要对多个外部引用进行同步更新的场景。
内容的提问来源于stack exchange,提问作者LJH
相关产品推荐
相关产品推荐

