You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:53:09