2

这主要是出于好奇,因为有更好的方法来实现我能想到的几乎所有用例(至少在 C# 和我经常使用的其他语言中),但我最近在这里看到了一个作用域互斥锁,它是一个很酷的概念。

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

例如,如果我要这样做:

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

ScopedMutex 对象会保持其存在到 using 块的末尾,还是 GC 可以运行并在块中间处理它?

4

3 回答 3

6

不,GC 不会处理它。对该对象的引用存储在局部变量中(有关更多信息,请参阅此答案)。局部变量被认为是 GC 根,并且可以从它访问对象(它需要是可访问的,using块才能调用Dispose它)。

于 2010-02-24T23:31:00.417 回答
2

C# 编译器将为您隐式创建一个变量。using 语句在编译时实际上会转换为如下内容(您可以使用Redgate Reflector自己查看确切的代码,顺便说一句):

ScopedMutex scopedMutex1 = new ScopedMutex();
try
{
    // ...
}
finally
{
    scopedMutex1.Dispose();
}
于 2010-02-24T23:35:06.083 回答
0

它不会在中间块中处理它。

于 2010-02-24T23:31:29.900 回答