【发布时间】:2015-09-17 09:41:41
【问题描述】:
我想知道Action<T> 是否会在运行时删除对此类实例的所有其他引用时阻止对封闭类实例进行垃圾收集?
public class Class1
{
private Action<string> _callback;
public Class1(Action<string> callback)
{
_callback = callback;
}
public void DoSomething(string msg)
{
_callback(msg);
}
}
public class Class2
{
private List<Class1> _class1s;
public Class2()
{
_class1s = new List<Class1>();
}
public void AddClass1Instance()
{
_class1s.Add(new Class1(OnClass1DoSomething));
}
public void RemoveLastClass1Instance()
{
if(_class1s.Count > 0)
{
_class1s.RemoveAt(_class1s.Count - 1);
}
}
private void OnClass1DoSomething(string msg)
{
}
}
在这个简单的例子中,当我在Class2 中调用RemoveLastClass1Instance() 时,Class1 实例是否会被垃圾回收,还是通过Action<string> 保持对OnClass1DoSomething() 的引用?我的目标是完全删除 Class1 实例并将它们收集为垃圾。
编辑:(为了更好地理解 Jon Skeet 的 cmets,我添加了以下代码
public class Class1
{
public event Action<string> Event;
public Class1()
{
}
public void DoSomething(string msg)
{
var handle = Event;
if (handle != null)
{
handle(msg);
}
}
}
public class Class2
{
private List<Class1> _class1s;
public Class2()
{
_class1s = new List<Class1>();
}
public void AddClass1Instance()
{
var newClass1Instance = new Class1();
newClass1Instance.Event += OnClass1DoSomething;
_class1s.Add(newClass1Instance);
}
public void RemoveLastClass1Instance()
{
if(_class1s.Count > 0)
{
_class1s.RemoveAt(_class1s.Count - 1);
}
}
private void OnClass1DoSomething(string msg)
{
}
}
【问题讨论】:
-
为
OnClass1DoSomething创建一个Action<string>将创建一个委托维护对Class2实例的引用,而不是Class1... -
当然,Class1 对象将继续引用 Class2。但是 GC 并不关心这些,它会查找对 Class1 对象的引用。由于您删除了存储在 List 中的唯一引用,因此没有剩余引用,它将被收集。同样,必须有对 Class2 对象的引用。如果没有(Class1 对象持有的引用不够),则 Class2 和 all Class1 对象都将被收集。
标签: c# reference callback garbage-collection