2013-01-16 55 views
0

在Python中,你可以這樣做:在C#中的using語句中使用多個值?

with open('filename') as f, something_else(f) as thing: 
    do_thing(thing) 

,它會做的open位,那麼something_else位。當該塊退出時,它將以相反的順序「處置」它。

現在我已經得到了一些C#代碼:

using (var cmd = new DB2Command(...)){ 
    using (var rdr = cmd.ExecuteReader()){ 
     // Magic super-duper-top-secret-code-here 
    } 
} 

有沒有辦法,我可以結合cmdrdr成一個using聲明什麼辦法?

回答

4

如果兩個對象共享相同的類型,並且它們不在此處,則只能這樣做。

注意,有沒有必要爲你在外using使用大括號,並且代碼看起來更清潔無它:

using (var cmd = new DB2Command(...)) 
using (var rdr = cmd.ExecuteReader()) 
{ 
    // Magic super-duper-top-secret-code-here 
} 

如果對象都是同一類型的,你可以這樣做:

using(FileStream stream1 = File.Open("", FileMode.Open) 
    , stream2 = File.Open("", FileMode.Open)) 
{ 
} 
+0

偉大的思想家認爲一樣;-) +1 – Steven

+0

@Steven這是一個廣泛使用的模式。 – Servy

+0

難道你不想成爲一個偉大的思想? ;-) – Steven

2

你可以這樣做:

using (var cmd = new DB2Command(...)) 
using (var rdr = cmd.ExecuteReader()) 
{ 
    // Magic super-duper-top-secret-code-here 
} 

這就是它會得到最好的。

0

,所以我會嘗試一些使用不使用...

public void processDisposables<T1, T2>(T1 type1, T2 type2, Action<T1, T2> action) 
     where T1: IDisposable 
     where T2: IDisposable { 

      try { 
       action(type1, type2); 
      } finally { 
       type1.Dispose(); 
       type2.Dispose(); 
      } 
    } 

,它是美國ge:

processDisposables(new MemoryStream(), new StringReader("Frank Borland is 112"), (m, s) => { 
     m.Seek(0, SeekOrigin.End); 
     // other stuff with IDisposables 
    });