c# - using block 是否算作对其捕获的 IDisposable 的引用?

标签 c# .net garbage-collection

假设我已经定义了 followed 方法。

static object F()
{
    return new object();
}

如果我编写如下代码,则返回的 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)

如果我编写如下代码,返回的对象可以在F返回后立即被垃圾回收。

{
    F();
    // can now garbage collect the object
    // returned by F
}

但现在假设我将 F 的定义更改为以下内容。

static IDisposable F()
{
    return new SomeDisposableObject();
}

如果我编写如下代码,返回的对象将无法被垃圾回收,并且在 using block 结束之前不会被释放。

using (IDisposable x = F())
{
} // immediately x.Dispose()
// can now garbage collect the object
// returned by F

如果我编写如下代码,行为是什么?对 C# 语言规范的引用是一个优势。

using (F())
{
}

using block 是否算作对 F 返回实例的引用?

最佳答案

是的。

你不能在没有引用的情况下处置它。

规范 states using (expression) { statement } 被编译为:

{
   ResourceType resource = expression;
   try {
      statement;
   }
   finally {
      if (resource != null) ((IDisposable)resource).Dispose();
   }
}

resource 是引用。

关于c# - using block 是否算作对其捕获的 IDisposable 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17886734/

相关文章:

c# - 如何通过比较两个数组来检索不同的字符串值?

c# - 保存时不更新 RichTextBox 内容

c# - dotNet 十进制类型是否容易受到二进制比较错误的影响?

c# - MVC Web 框架和 Mono

java - 高 GC、CPU Activity 和元空间似乎没有增加,Web 应用程序执行变得无响应

c# - Tibco 消息监听器 - 垃圾收集

c# - asp.net中的语音记录

c# - t4 模板中返回 html 的方法/函数

c# - Matlab与.NET 4.0数据通信

docker - 更改 Solr 的 JVM 参数