2013-07-29 113 views
4

這是真的,在using語句中聲明的變量放在一起,因爲它們在使用塊的範圍內?使用語句和IDisposable接口

我需要做的事:

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

    } 
} 

或許這會不夠,是「欄」設置有「富」起來呢?

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

在第二個版本中,bar將會超出範圍但不會被丟棄。但是,你可以將兩個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()'拋出一個異常,或者在進入'using'塊之前發生線程異常,那麼'foo'(和'bar')永遠不會被丟棄。 –

+3

正確的語法是'使用(S1 foo = new S1())using(S2 bar = new S2()){...}'或者如果'foo'和'bar'是相同的類型''使用(S1 foo = new S1(),bar = new S1()){...}'。如果使用(S1 foo = new S1(); S2 bar = new S2()){...}'是合法的,但它不是合法的。 –

4

爲了讓他們都佈置有using語句你不必窩他們,但是你可以這樣寫

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

    } 
} 

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


}