Tim*_*lds 3 .net c# garbage-collection
假设我已经定义了以下方法.
static object F()
{
return new object();
}
Run Code Online (Sandbox Code Playgroud)
如果我编写如下代码,则object在范围结束之前不能对返回的内容进行垃圾回收.
{
object x = F();
// cannot yet garbage collect the object
// returned by F (referenced as variable x)
}
// can now garbage collect the object
// returned by F (referenced as variable x)
Run Code Online (Sandbox Code Playgroud)
如果我编写如下代码,返回后object可以立即回收垃圾F.
{
F();
// can now garbage collect the object
// returned by F
}
Run Code Online (Sandbox Code Playgroud)
但现在假设我将定义更改F为以下内容.
static IDisposable F()
{
return new SomeDisposableObject();
}
Run Code Online (Sandbox Code Playgroud)
如果我编写如下代码,则返回的对象不能被垃圾收集,并且在using块结束之前不会被丢弃.
using (IDisposable x = F())
{
} // immediately x.Dispose()
// can now garbage collect the object
// returned by F
Run Code Online (Sandbox Code Playgroud)
如果我编写如下代码,那么行为是什么?引用C#语言规范是一个优点.
using (F())
{
}
Run Code Online (Sandbox Code Playgroud)
该using块是否计为对返回的实例的引用F?
是.
你不能在没有参考的情况下处置某些东西.
该规范的状态是using (expression) { statement }被编译为:
{
ResourceType resource = expression;
try {
statement;
}
finally {
if (resource != null) ((IDisposable)resource).Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
resource 是一个参考.