Есть ли способ получить блок `using`, который не определяет блок области видимости? - PullRequest
0 голосов
/ 09 мая 2019
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 ]

2 голосов
/ 09 мая 2019

Вы можете добавить немного сахара, чтобы избавиться от блока 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));
0 голосов
/ 09 мая 2019

A using оператор определяет блок. Если вы хотите, чтобы переменная была доступна вне ее, вам нужно определить ее вне этого блока, но вы можете присвоить ей в блоке:

string myAnswer = null;
using(var myDisposable = new MyDisposable)
{
    myAnswer = CalculateMyAnswer(myDisposable);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...