2011-01-10 3 views
1

Есть ли способ написать инструкцию using без создания экземпляра объекта IDisposable?Задержка с использованием C# с использованием statment

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

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

    // do some stuff 

} // end of 'using' 

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

+0

3 (почти) идентичные ответы менее чем за минуту. Ницца! : D – Rob

ответ

4

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

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

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

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

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

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

+0

тщательный и информативный, как всегда, сэр, спасибо. – fearofawhackplanet

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

} 
1

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

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

using (thing) 
{ 

    // do some stuff 
} 
1

Я думаю, что наиболее вменяемое решение перенести решение, что с конфигурацией в конструктор 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 
    } 
    } 
}