2010-06-22 67 views
5
using (Font font3 = new Font("Arial", 10.0f), 
      font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 

我知道使用子句可以在內使用同一類型的多個對象。我可以使用*塊在C#*中使用不同類型的對象嗎?

我不能使用中的不同類型的對象使用子句嗎?

嗯,我試過,但儘管他們不同的名稱和不同的對象,他們的行爲同樣=有同樣的一套方法

是否有使用使用類不同類型的任何其他方式?

如果不是,使用它的最合適的方法是什麼?

回答

28
using(Font f1 = new Font("Arial",10.0f)) 
using (Font f2 = new Font("Arial", 10.0f)) 
using (Stream s = new MemoryStream()) 
{ 

} 

像這樣?

10

不,你不能這樣做,但你可以nestusing塊。

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (Font font4 = new Font("Arial", 10.0f)) 
    { 
     // Use font3 and font4. 
    } 
} 

或其他人說的,但我不會因爲可讀性而推薦它。

using(Font font3 = new Font("Arial", 10.0f)) 
using(Font font4 = new Font("Arial", 10.0f)) 
{ 
    // use font3 and font4 
} 
+10

說實話 - 我發現後者更具可讀性。如果您正在初始化三個或四個項目(如流,StreamReader,Stream,Streamwriter),嵌套可能完全失去控制!我想這可能是你習慣的。 – 2010-06-22 10:42:51

+1

這完全取決於個人。你用你喜歡或喜歡的方式使用它。 – 2010-06-22 10:46:43

+0

雖然不言而喻,但一致性是最重要的。 – etc 2010-06-22 10:58:44

3

您只能在每個using塊中初始化一種類型的對象。您可以嵌套的,只要你想盡可能多的,但是:

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (Brush b4 = new Brush()) 
    { 

    } 
} 
+0

實際上,您可以擁有多個相同類型的對象,如問題所示。 – Codesleuth 2010-06-22 12:49:42

2

可以嵌套他們:

using (Font font3 = new Font("Arial", 10.0f)) 
using (font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 

他們應該按相反的順序處理(font4第一)。

編輯:

這是完全一樣的:

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (font4 = new Font("Arial", 10.0f)) 
    { 
     // Use font3 and font4. 
    } 
} 
+0

您是否有鏈接指出它們以相反順序處理的文檔? – Dolphin 2010-06-22 14:59:36

+0

我想我在課程上聽說過,但是,堆疊它們與嵌套它們是一樣的。見修改文本。 – 2010-06-22 18:26:19

+1

從C語言的語法中很容易看出。 * using-statement *的語法是:using(* variable initialization *)* statement *請注意,堆疊和大括號都不是語法的明確部分。它們被遞歸語法所暗示。當* statement *是一個using語句時,您可以進行堆棧。當* statement *是* block-statement *時,您有大括號。 – 2010-06-23 01:13:14

6

可以疊加使用的語句來實現:

using(Font font3 = new Font("Arial", 10.0f)) 
using(Font font4 = new Font("Arial", 10.0f)) 
{ 
    // use font3 and font4 
} 
3

您可以用逗號分隔的相同類型的項目 - 好吧,我只知道編譯器沒有抱怨。您也可以使用()語句堆棧(使用不同類型的一組括號{})。

http://adamhouldsworth.blogspot.com/2010/02/things-you-dont-know.html

+0

我已在您的博客上評論了您的鏈接中的foreach示例。 – 2010-06-22 12:24:43

+0

好點,我改變了它 - 它看起來好像正在發生,但所發生的一切都是編譯器讓你忽略括號{},它只是一個嵌套的foreach。 – 2010-06-22 12:42:06

5

using語句目的是保證所獲取的資源被明確地通過向Dispose方法的調用由IDisposable接口提供設置。該規範不允許您在單個使用語句中獲取不同類型的資源,但考慮到第一句話,您可以使用編譯器編寫這個完美有效的代碼。

using (IDisposable d1 = new Font("Arial", 10.0f), 
    d2 = new Font("Arial", 10.0f), 
    d3 = new MemoryStream()) 
{ 
    var stream1 = (MemoryStream)d3; 
    stream1.WriteByte(0x30); 
} 

然而,我不建議這,我認爲這是侮辱性的,所以這個答案只是爲了說明您可以破解它周圍,但你可能不應該。

+0

投票向我們展示*不*要做的事情。 – 2010-06-22 14:52:42

相關問題