2013-07-29 3 views
4

Верно ли, что переменные, объявленные в операторе using, расположены вместе, потому что они входят в область использования блока?Использование оператора и интерфейса IDisposable

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation()) 
{ 
    using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2()) 
    { 

    } 
} 

или это будет достаточно и «бар», расположенный вместе с «Foo»:

мне нужно делать делать?

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation()) 
{ 
    SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2(); 
} 
+0

Вы пропустили '=' в 'SomeIdisposableImplementation2'? – Praveen

ответ

11

или это будет достаточно и «бар», расположенный вместе с «Foo»?

Нет, бар не будет утилизирован.

using оператор переводит в try-finally блок, так что даже если происходит исключение finally блок обеспечивает вызов Dispose метода.

После

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation()) 
{ 
    SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2(); 
} 

выливается

{ 
    SomeIdisposableImplementation foo; 
    try 
    { 
     foo = new SomeIdisposableImplementation(); 
     SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2(); 
    } 
    finally 
    { 
     if (foo != null) 
      foo.Dispose(); 
    } 
} 

Оставляя bar не-утилизировать.

1

Во второй версии панель выйдет из сферы действия, но не будет удалена. Но вы можете поместить как Foo и бар, в то же самое с помощью команды:

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation(), SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2()) 
{ 
    // use foo and bar 
} 

вы можете просто положить переменные в помощью команды:

SomeIdisposableImplementation foo = new SomeIdisposableImplementation(); 
SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2(); 
using (foo, bar) 
{ 
    // use foo and bar 
} 
+0

Первое предложение этого ответа верно. Остальное не так. –

+0

Ваш отредактированный второй вариант Roland неверен. Если 'bar = new SomeIdisposableImplementation2()' генерирует исключение или возникает поточное исключение перед входом в блок 'use'' foo' (и 'bar'), он никогда не будет удален. –

+3

Правильный синтаксис - это «использование (S1 foo = new S1()) с использованием (S2 bar = new S2()) {...}' или, если 'foo' и' bar' являются одним и тем же типом, используя (S1 foo = новый S1(), bar = новый S1()) {...} '. Было бы неплохо, если бы использование (S1 foo = new S1(); S2 bar = new S2()) {...} 'было законным, но это не так. –

4

Чтобы получить их как утилизировать с помощью заявления вы не гнездиться их однако вы можете написать это

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation()) 
{ 
    using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2()) 
    { 

    } 
} 

в

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation()) 
using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2()) 
{ 


} 
Смежные вопросы