假设我有一个简单的类是一次性的:
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)
一个using声明并不具有声明一个变量。将一次性作为out参数并不理想,您应该在自己的代码中避免使用它,但是如果您正在使用一个这样做的库,您可以using在调用方法后简单地将变量放入块的表达式中。
CreateDisposable(out CanDispose myDispose);
using (myDispose)
{
}
Run Code Online (Sandbox Code Playgroud)
我如何把它放在 using 语句中?
你不。这两种模式——输出参数和自动处理通过using——组合得不好。
我是否必须求助于返回一个元组(这行得通吗?)
我注意到“这行得通吗?”形式的问题。可以通过尝试来回答。但是为了节省您的按键次数:元组不是一次性的。
有没有更简单的方法?
只需using在out参数上使用一个块;做两个陈述,而不是一个。
但是你的问题表明这里有一个更根本的问题。据推测,返回的布尔值是有意义的。听起来您打算using无论如何都忽略该 Boolean 和out 参数;如果这样做是安全的,那么只需制作一个不带布尔值的返回值的版本,因为它显然没有用。
更一般地说——你从工厂返回两个值的事实是一种代码味道。你能说更多关于你在做什么吗?可能有更好的模式可以完全使用。