2014-03-03 92 views
-3

考慮這個類:嵌套處置using語句

class Person : IDisposable 
{ 
    public Person(int age) 
    { 

    } 
    public void Dispose() 
    { 
     Console.WriteLine("Dispose"); 
    } 
} 

和驗證碼:

using (Person perosn = new Person(0)) 
{ 
    using (Person child = new Person(1)) 
    { 
    } 
} 

當運行這段代碼的輸出是在控制檯創建兩個Dispose

我改變類:

class Person : IDisposable 
{ 
    public Person(int age) 
    { 
     if (age == 1) 
     { 
      throw new Exception("Person"); 
     } 
    } 
    public void Dispose() 
    { 
     Console.WriteLine("Dispose"); 
    } 
} 

我得到例外,這兩個類不處理。

那麼,爲什麼當我扔在孩子的構造新的例外,這兩個類沒有設置?

+1

這不值錢upvotes的問題是提供錯誤的信息。 –

+0

無法重現。當內部構造函數拋出異常時我仍然看到使用正確處理類的外層。 – LeffeBrune

+0

一些有用的閱讀就是埃裏克利珀的有關異常的相互作用和'using'報表信息[這裏](http://blog.coverity.com/2014/02/26/resources-vs-exceptions/#.UxQ2bnVdWlg)。 –

回答

3

我沒有看到同樣的結果:

try { 
    using (Person perosn = new Person(0)) 
    { 
     using (Person child = new Person(1)) 
     { 
     } 
    } 
} catch { 
    Console.WriteLine("Caught exception"); 
} 

輸出:

Dispose 
Caught exception 
+0

我認爲提問者想知道爲什麼輸出'Disposed'只寫了一次。我不認爲你的答案涉及到這一點? –

+0

@JeppeStigNielsen:提問者說「這兩個類都不配置」,這意味着「Disposed」根本不會被編寫。另一方面,英語顯然不是他的第一語言,所以你的解釋*可能是正確的。 – Heinzi

3

using語句引用類型轉化爲

{ 
    ResourceType resource = expression; 
    IDisposable d = (IDisposable)resource; 
    try { 
     statement; 
    } 
    finally { 
     if (d != null) d.Dispose(); 
    } 
} 

正如你看到的,初始化在try之前執行,所以當構造函數拋出except時沒有調用Dispose。這就是爲什麼你看到只有一個Disposed字符串打印。

檢查8.13在C#中使用規範聲明看多。