gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:12:21 25 4
gpt4 key购买 nike

假设我已经定义了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com