2014-03-03 3 views
-3

를 사용하여 중첩에 폐기고려,이 클래스를 문

이 코드 출력을 실행
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"); 
    } 
} 

나는 예외가 두 클래스는 처리하지 않습니다

나는 클래스를 변경합니다.

그렇다면 하위 생성자에서 새 예외를 throw 할 때 두 클래스가 모두 삭제되지 않습니다.

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

출력 : 참조 유형에 대한

Dispose 
Caught exception 
+1

질문이 잘못된 정보를 제공하기 때문에 이것은 많은 상향식의 가치가 없습니다. –

+0

재생할 수 없습니다. 내부 사용의 생성자가 예외를 throw 할 때 나는 여전히 클래스의 폐기를 올바르게 사용하여 외부를 참조합니다. – LeffeBrune

+0

유용한 도움말은 Eric Lippert의 예외 상호 작용 및 'using'문 [여기] (http://blog.coverity.com/2014/02/26/resources-vs-exceptions/#.UxQ2bnVdWlg)에 대한 게시물입니다. –

답변

3

나는 같은 결과를 확인할 수 없습니다 try 전에 수행되므로 생성자가 이온 Dispose은 호출되지 않습니다. 그래서 Disposed 문자열이 하나만 인쇄 된 것입니다.

확인 8.13 자세한 내용은 C#의 using 문을 참조하십시오.

+0

저는 Asker가 두 사람이 출력 Disposed가 한 번만 쓰여지는 이유를 알고 싶어했습니다. 당신의 대답이 그걸 만진 것 같지 않니? –

+0

@JeppeStigNielsen : Asker는 "두 클래스 모두 처분하지 않는다"고 말하면서, "Disposed"는 전혀 쓰여지지 않았다. 반면에 영어는 분명히 모국어가 아니므로 해석이 정확할 수도 있습니다. – Heinzi

3

using

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

로 변환되고, 초기화가