在实例为空后如何访问实例方法委托
本文关键字:访问 实例方法 何访问 实例 | 更新日期: 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
的第二个引用,该引用存储在BatchWorker
的Worker
操作中。因为仍然有一个对worker
实例的活动引用,所以它不会被垃圾收集。