“使用”一个输出参数

Sim*_*ker 2 c#

假设我有一个简单的类是一次性的:

class CanDispose : IDisposable
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

现在我显然可以把它放在一个“使用”块中以使其处理:

using (var myDisposable = new CanDispose())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是如果我有一个通过 out 参数返回一次性的工厂方法呢?在我的示例中,可以有多个返回,因此多个输出是干净的:

public bool CreateDisposable(out CanDispose canDispose)
{
   canDispose = new CanDispose();
   ...
   return ret; 
}
Run Code Online (Sandbox Code Playgroud)

我如何把它放在 using 语句中?简单地将函数调用放入 using 块似乎不起作用。我是否必须求助于返回一个元组(这行得通吗?),还是有更简单的方法?

请注意,这似乎不起作用。至少它不会在超出范围之前关闭有关处理的警告:

using (CreateDisposable(out CanDispose myDispose))
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

mad*_*ion 6

一个using声明并不具有声明一个变量。将一次性作为out参数并不理想,您应该在自己的代码中避免使用它,但是如果您正在使用一个这样做的库,您可以using在调用方法后简单地将变量放入块的表达式中。

CreateDisposable(out CanDispose myDispose);
using (myDispose)
{
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 6

我如何把它放在 using 语句中?

你不。这两种模式——输出参数和自动处理通过using——组合得不好。

我是否必须求助于返回一个元组(这行得通吗?)

我注意到“这行得通吗?”形式的问题。可以通过尝试来回答。但是为了节省您的按键次数:元组不是一次性的。

有没有更简单的方法?

只需usingout参数上使用一个块;做两个陈述,而不是一个。

但是你的问题表明这里有一个更根本的问题。据推测,返回的布尔值是有意义的。听起来您打算using无论如何都忽略该 Boolean 和out 参数;如果这样做是安全的,那么只需制作一个不带布尔值的返回值的版本,因为它显然没有用。

更一般地说——你从工厂返回两个值的事实是一种代码味道。你能说更多关于你在做什么吗?可能有更好的模式可以完全使用。