使用块是否为GC创建和维护引用?

时间:2010-02-24 23:28:53

标签: c# garbage-collection using using-statement

这主要是出于好奇心的缘故,因为有更好的方法可以实现几乎任何用于此构造的用例(在C#和我经常使用的其他语言中,至少),但我最近在这里看到了{ {3}}这是一个很酷的概念。

我的问题是,using语句是否维护一个引用(即:阻止GC运行)到它所作用的对象?

例如,如果我这样做:

using (new ScopedMutex())
{
// ...
}

ScopedMutex对象是否会在使用块结束时保持其存在,或者GC是否可以在块中运行并处理它?<​​/ p>

3 个答案:

答案 0 :(得分:6)

不,GC不会处理它。对该对象的引用存储在局部变量(see this answer for more info)中。局部变量被视为GC根,并且可以从该对象访问该对象(using块需要能够访问它才能在其上调用Dispose

答案 1 :(得分:2)

C#编译器将隐式为您创建变量。在编译时,using语句实际上会被转换成类似下面的东西(你可以使用Redgate Reflector来查看你自己的确切代码,顺便说一下):

ScopedMutex scopedMutex1 = new ScopedMutex();
try
{
    // ...
}
finally
{
    scopedMutex1.Dispose();
}

答案 2 :(得分:0)

它不会在中间区域处理它。