有什么方法可以拥有一个没有定义作用域块的"使用"块?


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);
}

最新更新