在实例为空后如何访问实例方法委托

本文关键字:访问 实例方法 何访问 实例 | 更新日期: 2023-09-27 18:08:14

如何在实例被设置为null后仍然可以访问实例委托方法?下面代码中的操作委托指向一个实例方法,但在实例被设置为null后,该方法仍然可用。

public class Work { public string Name{get;set;} } 
public class Worker
{
    public void Do(Work work)
    {
        Console.WriteLine("'{0}' is done.", work.Name);
    }
}
public class BatchWorker
{
    private List<Work> _works;
    public readonly Action<Work> Worker;
    public BatchWorker(Action<Work> worker)
    {
        _works = new List<Work>();
        Worker = worker;
    }
    public void AddWork(Work work)
    {
        this._works.Add(work);
    }
    public void DoWorks()
    {
        this._works.ForEach(this.Worker);
    }
}
public class Program{
    public static void Main(){
        var worker = new Worker();
        var batchWorker = new BatchWorker(worker.Do);
        batchWorker.AddWork(new Work {Name = "Task 1"});
        worker = null; // the instance is now null.
        Console.WriteLine("Target worker is null? {0}'r'n", batchWorker.Worker.Target == null);
        // How is this having access to instane method after the instance is null?
        batchWorker.DoWorks();
    }
}

输出

,目标工作者为空?假

,"任务1"已完成。

在实例为空后如何访问实例方法委托

你的误解在这里:

// the instance is now null.

它不是。您只是将变量 worker更改为指向null。这不会以某种方式破坏使无效Worker的实例。

也许阅读变量,对象和引用是什么会有所帮助。不久前有一个关于这个的问题:变量、对象和引用之间的区别是什么?

委托包含对要调用它的实例的引用。线:

var batchWorker = new BatchWorker(worker.Do);

创建对worker的第二个引用,该引用存储在BatchWorkerWorker操作中。因为仍然有一个对worker实例的活动引用,所以它不会被垃圾收集。