2012-07-18 5 views
0

은, 다음과 같은 코드가 사용되었습니다마지막으로 사용에 대한 차단 - 다른 컨텍스트 인 마지막으로 발생합니까? 일부 코드 내가 일상적 작업 (그리고 몇 번 쓴)에서

using (StreamWriter sw = new FileWriter(".\SomeFile.txt")) 
{ 
    // Perform file IO here... 
} 
finally 
{ 
    sw.Close(); 
} 

나는/마지막으로 C#으로 ... 내가 아는 시도/캐치 알고 있어요 그 문맥이 마침내 작동합니다. "마지막으로 사용"이라는 용어로 Google 검색을 수행했을 때 관련성이 높은 일치 항목을 찾을 수 없었습니다.

이 컨텍스트는 마지막으로 Using 문의 마지막 명령이 실행될 때 Finally 블록의 내용이 실행되는 곳에서 작동합니까? 아니면 내가 (그리고 내가 작업하고있는 코드베이스)이 모든 잘못이있다; 마지막으로 Try/Catch로 제한됩니까? 어쨌든 (종류의)를 usingtry에 닷넷 변환 -

+0

전에 '사용'과 '마지막'조합을 본 적이 없습니다. 왜, Close()를 명시 적으로 호출 할까? – sloth

+0

솔직히 말해서, 이것은 다른 사람들에게서 본 코드입니다. 나는 A) Dispose가 정의되지 않았거나 B) Dispose가 방법에 따라 모든 것을 정리하지 않을 수 있기 때문에 관리되지 않는 리소스 (File IO, DB Connections)에 대한 정리가 수동으로 발생해야한다고 생각합니다. 그 '자원'의 저자는 그것을 구현하기로 결정했다. –

답변

1

마지막으로 Try/Catch로 제한됩니까?

Yes. finally 블록 앞에 try 블록이 있어야합니다. catch 만 선택 사항입니다. 게다가 너는 scope에 관하여 조금 읽어야한다. using 블록에서 선언 한 sw 변수는 해당 블록 외부에서 액세스 할 수 없습니다.

는 또한, using는 그 블록의 마지막 명령 실행) 그렇게 할 때 StreamWriter (FileWriter 즉시 블록이 범위를 벗어나 자바 ;-)에서 (즉, 당신은 폐기하거나 닫기를하지 않아도 처리됩니다 수동으로.

0

마지막으로 항상 (catch되지 않은) 예외가

0

나는 usingIL로 변환 할 때 믿고 중요하지 않습니다가 있는지 여부, 작동 - 그래서이 맥락에서 여전히 의미가있을 것입니다.

See this article.

1

마지막으로 항상 실행하지만 약자로 코드는 대부분 중복됩니다. 코드 :

using (StreamWriter sw = new FileWriter(".\SomeFile.txt")) 
{ 
    // Perform file IO here... 
} 

{ 
    StreamWriter sw = new FileWriter(".\SomeFile.txt"); 
    try { 
     // Perform file IO here... 
    } 
    finally { 
     ((IDisposable)sw).Dispose(); 
    } 
} 

에서는 StreamWriter의 폐기() 메소드는 암시 적으로 닫기()를 호출

기능적으로 동일합니다. 그러나 이것은 사용자 정의 Finally가 시스템 암시 적 Finally 전에 실행되기 때문에 오류가되어서는 안됩니다.

+1

반대의 경우 :'StreamWriter.Close()'는'Dispose' 메서드를 호출합니다. – sloth

+0

하하, 내가 호기심을 갖게되어 반사경을 두 번 확인했다. 충분히 즐겁게, 우리 둘 다 맞습니다. 'Dispose()'는 필요한 경우 this.stream.Close()를 호출하고, Close()는 즉시 Dispose()를 호출합니다. 여기에 붙여 넣기 : http://pastebin.com/BbcEqVwg – tmesser