using(var myDisposable = new MyDisposable)
{
//Do stuff.
}
很棒。但是,如果您想要的是:
using(var myDisposable = new MyDisposable)
{
var myAnswer = CalculateMyAnswer(myDisposable);
}
您想稍后使用myAnswer
,然后您必须在块外声明myAnswer
,并且它开始变得有点faffy。:(
是否有任何方法可以声明using
块,但没有封装范围,以便在该块内部仍然可见变量?
到目前为止,我最好的解决方案是手动处理我的变量:
var myDisposable = new MyDisposable
var myAnswer = CalculateMyAnswer(myDisposable);
myDisposable.Dispose();
但这失去了我对using
的很多东西。
有其他选择吗?
您可以使用此方法在代码中添加一些糖以摆脱代码中的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));
a using
语句定义一个块。如果要在外部访问一个变量,则需要在该块之外 define 它,但是您可以在块中分配在块中:
string myAnswer = null;
using(var myDisposable = new MyDisposable)
{
myAnswer = CalculateMyAnswer(myDisposable);
}