using(var myDisposable = new MyDisposable)
{
//Do stuff.
}
非常棒。 但是,如果您想要的是:
using(var myDisposable = new MyDisposable)
{
var myAnswer = CalculateMyAnswer(myDisposable);
}
,您想稍后再使用myAnswer
,那么您必须在块外声明myAnswer
,这开始有点麻烦了。 :(
是否有任何方法可以声明一个using
块,但没有封装范围,以便在该块外部声明的变量在该块外部仍然可见?
到目前为止,最好的解决方案是手动处理变量:
var myDisposable = new MyDisposable
var myAnswer = CalculateMyAnswer(myDisposable);
myDisposable.Dispose();
但是,这使我对using
失去了很多兴趣。
还有其他选择吗?
答案 0 :(得分:2)
您可以使用以下方法向其中添加一些糖,以消除代码中的using
块:
public static class Disposable
{
public static T Using<R, T>(Func<R> factory, Func<R, T> projection) where R : IDisposable
{
using (var r = factory())
{
return projection(r);
}
}
}
然后您将像这样使用它:
var myAnswer = Disposable.Using(() => new MyDisposable(), m => CalculateMyAnswer(m));
答案 1 :(得分:-1)
using
语句定义一个块。如果希望变量在其外部可以访问,则需要在该块之外定义,但是您可以在该块中分配:
string myAnswer = null;
using(var myDisposable = new MyDisposable)
{
myAnswer = CalculateMyAnswer(myDisposable);
}