C#Lambda对象范围

时间:2011-02-27 12:46:27

标签: c# lambda

我刚刚在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调用的范围内?一旦调用该方法,该对象是否被销毁?

感谢。

2 个答案:

答案 0 :(得分:2)

在这种特殊情况下,会发生的事情是foo对象与您的委托一起传递给Bar方法。 Bar方法调用动作,在foo上调用DoSomething,然后返回。

由于方法Bar不返回传递给它的对象,也没有返回调用委托的结果,并且有问题的代码不会将对象引用存储在任何地方,因此您创建的对象foo一旦Bar返回,现在有资格进行垃圾收集。

确切地说,当回收该对象的内存取决于GC何时运行,但是在Bar返回后的某个时刻,将回收分配给该对象的内存。它不会立即发生,即。作为Bar回归的一部分。

答案 1 :(得分:0)

是的,一旦方法返回就应该处理它,因为没有一个操作产生额外的引用。

但是,这不是一般情况,它实际上取决于方法对它的作用 - 如果它创建一个引用内联创建的对象的新对象,它可以在返回方法后生效。在这种情况下,Action<T>可以将Foo添加到字典或某种类型的列表中,这意味着它不会被垃圾收集,因为仍然有对它的引用。