这主要是出于好奇,因为有更好的方法来实现我能想到的几乎所有用例(至少在 C# 和我经常使用的其他语言中),但我最近在这里看到了一个作用域互斥锁,它是一个很酷的概念。
我的问题是, using 语句是否维护对它所作用的对象的引用(即:防止 GC 运行)?
例如,如果我要这样做:
using (new ScopedMutex())
{
// ...
}
ScopedMutex 对象会保持其存在到 using 块的末尾,还是 GC 可以运行并在块中间处理它?
这主要是出于好奇,因为有更好的方法来实现我能想到的几乎所有用例(至少在 C# 和我经常使用的其他语言中),但我最近在这里看到了一个作用域互斥锁,它是一个很酷的概念。
我的问题是, using 语句是否维护对它所作用的对象的引用(即:防止 GC 运行)?
例如,如果我要这样做:
using (new ScopedMutex())
{
// ...
}
ScopedMutex 对象会保持其存在到 using 块的末尾,还是 GC 可以运行并在块中间处理它?
不,GC 不会处理它。对该对象的引用存储在局部变量中(有关更多信息,请参阅此答案)。局部变量被认为是 GC 根,并且可以从它访问对象(它需要是可访问的,using
块才能调用Dispose
它)。
C# 编译器将为您隐式创建一个变量。using 语句在编译时实际上会转换为如下内容(您可以使用Redgate Reflector自己查看确切的代码,顺便说一句):
ScopedMutex scopedMutex1 = new ScopedMutex();
try
{
// ...
}
finally
{
scopedMutex1.Dispose();
}
它不会在中间块中处理它。