有没有定义作用域块的“使用”块的任何方法?

时间:2019-05-08 23:10:05

标签: c# scope using-statement

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失去了很多兴趣。

还有其他选择吗?

2 个答案:

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