这主要是出于好奇心的缘故,因为有更好的方法可以实现几乎任何用于此构造的用例(在C#和我经常使用的其他语言中,至少),但我最近在这里看到了{ {3}}这是一个很酷的概念。
我的问题是,using语句是否维护一个引用(即:阻止GC运行)到它所作用的对象?
例如,如果我这样做:
using (new ScopedMutex())
{
// ...
}
ScopedMutex对象是否会在使用块结束时保持其存在,或者GC是否可以在块中运行并处理它?</ p>
答案 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)
它不会在中间区域处理它。