我刚刚在Lambda上观看TekPub视频,代码与此类似:
class Foo{
void DoSomething();
}
static void Bar(Foo item, Action<Foo> action){
return action.Invoke(item);
}
然后在Main:
Bar(new Foo(), x=>x.DoSomething();
我的问题是,Foo
对象是否在Bar
调用的范围内?一旦调用该方法,该对象是否被销毁?
感谢。
答案 0 :(得分:2)
在这种特殊情况下,会发生的事情是foo
对象与您的委托一起传递给Bar方法。 Bar方法调用动作,在foo上调用DoSomething,然后返回。
由于方法Bar不返回传递给它的对象,也没有返回调用委托的结果,并且有问题的代码不会将对象引用存储在任何地方,因此您创建的对象foo
一旦Bar返回,现在有资格进行垃圾收集。
确切地说,当回收该对象的内存取决于GC何时运行,但是在Bar返回后的某个时刻,将回收分配给该对象的内存。它不会立即发生,即。作为Bar回归的一部分。
答案 1 :(得分:0)
是的,一旦方法返回就应该处理它,因为没有一个操作产生额外的引用。
但是,这不是一般情况,它实际上取决于方法对它的作用 - 如果它创建一个引用内联创建的对象的新对象,它可以在返回方法后生效。在这种情况下,Action<T>
可以将Foo
添加到字典或某种类型的列表中,这意味着它不会被垃圾收集,因为仍然有对它的引用。