Задержка инстанцирования с помощью c # с использованием statment - PullRequest
1 голос
/ 10 января 2011

Есть ли способ написать оператор using без создания экземпляра IDisposable немедленно?

Например, если мне нужно было сделать что-то вроде:

using (MyThing thing)
{
    if (_config == null)
    {
         thing = new MyThing();
    }
    else
    {
         thing = new MyThing(_config);
    }

    // do some stuff

} // end of 'using'

Есть ли приемлемый шаблон для подобных случаев? Или я снова вернулся к обработке IDisposable явно?

Ответы [ 4 ]

4 голосов
/ 10 января 2011

Ну, в вашем примере вы делаете создание экземпляра одноразового объекта немедленно - только на основе условия.Например, вы можете использовать:

using (MyThing thing = _config == null ? new MyThing() : new MyThing(_config))
{
    ...
}

Чтобы быть более общим, вы можете использовать метод:

using (MyThing thing = CreateThing(_config))
{
}

Хитрый бит будет, если время создания экземпляра изменилось на основеразличные условия.Это действительно будет сложнее сделать с помощью оператора using, но также предложит , чтобы вы попытались реорганизовать свой код, чтобы избежать этого требования.Это не всегда возможно, но стоит попробовать.

Другая альтернатива заключается в инкапсуляции «вещи» в оболочку, которая будет лениво создавать одноразовый объект real и делегироватьчто для утилизации и все остальное, что вы можете сделать с типом.Такое делегирование может быть болезненным в некоторых ситуациях, но может подойти - в зависимости от того, что вы действительно пытаетесь сделать.

2 голосов
/ 10 января 2011
using (MyThing thing = _config == null ? new MyThing() : new MyThing(_config))
{
   // ....

}
1 голос
/ 10 января 2011

Я думаю, что самым разумным решением является перенести решение о том, что с конфигурацией в конструктор MyThing.Таким образом, вы можете упростить использование класса следующим образом:

using (MyThing thing = new MyThing(_config))
{

} 

class MyThing {
  public MyThing() {
    //default constructor
  }

  public MyThing(Config config) :this() {
    if (config == null)
    {
         //do nothing, default constructor did all the work already
    }
    else
    {
         //do additional stuff with config
    }
  }
}
1 голос
/ 10 января 2011

Вы можете сделать:

if (_config == null)
{
     thing = new MyThing();
}
else
{
     thing = new MyThing(_config);
}

using (thing)
{

    // do some stuff
}
...