성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<span> <br /> <div class='mainCenterTitle'>.NET IDisposable 처리 정리</div><br /> <br /> 사실, IDisposable을 이용한 자원 해제는 은근히 복잡합니다. <br /> 크게 고려해야 할 사항이 2가지가 있는데요. 이에 따라서 그 구현 패턴이 단순해질 수도 있고, 복잡해질 수도 있습니다. 뭐 대충 나눠보면 다음과 같은 경우가 되겠지요.<br /> <br /> 1. "Managed" 자원 해제를 하는 경우<br /> 2. "Unmanaged" 자원 해제를 하는 경우<br /> 3. "Managed" / "Unmanaged" 모두 해제를 하는 경우<br /> <br /> 하나씩 패턴을 살펴보면 좋겠지만, 제 개인적인 의견으로는 무조건 3번째 방식으로 코딩을 할 것을 권장합니다. 일관성 있게 하되 모든 경우의 수를 포함하는 것이 바람직할 것이기 때문입니다.<br /> <br /> 사실, 이 패턴은 이미 다음과 같이 도움말에 공개되어져 있습니다.<br /> <br /> Visual Basic 언어 개념 <br /> 방법: Dispose Finalize 패턴 구현(Visual Basic)<br /> ; <a target='_blank' href='https://learn.microsoft.com/ko-kr/previous-versions/visualstudio/visual-studio-2008/s9bwddyx(v=vs.90)'>https://learn.microsoft.com/ko-kr/previous-versions/visualstudio/visual-studio-2008/s9bwddyx(v=vs.90)</a><br /> <br /> 그래도, ^^ 그냥 한번 다시 써보겠습니다.<br /> <br /> 다음의 코드는 최초 Base 클래스가 구현해야 하는 코드입니다.<br /> <pre class='code'> 01: public class Base : IDisposable 02: { 03: protected bool _disposed = false; 04: 05: protected virtual void Dispose(bool disposing) 06: { 07: if (_disposed == false) 08: { 09: if (disposing == true) 10: { 11: <b>// 이 영역 안에서 Managed 자원을 해제</b> 12: } 13: 14: <b>// 이 영역 안에서 Unmanaged 자원을 해제</b> 15: 16: _disposed = true; 17: } 18: } 19: 20: public void Dispose() 21: { 22: Dispose(true); 23: GC.SuppressFinalize(this); 24: } 25: 26: ~Base() 27: { <b>// [2006-10-06 내용 추가] #if DEBUG if (false == _disposed) { throw new ApplicationException("Base.Dispose() was not called!"); } #endif</b> 28: Dispose(false); 29: } 30: } </pre> <br /> 위에서 보시면, 11번째 줄과, 14번째 줄에서 Managed와 Unmanaged에 대한 자원 해제를 disposing 플래그를 통해서 구분을 했다는 것이 의미가 있습니다. 왜냐하면 disposing == false인 상황은 언제나 finalizer가 호출되는 시점이므로 내부의 Managed 자원 역시 finalizer에 의한 호출이 발생했을 것이기 때문에 굳이 다시 해줄 필요가 없기 때문입니다.<br /> 최초의 클래스는 위와 같이 다소 복잡하긴 하지만, 일단 위와 같이 뼈대만 잘 잡아 주시면 상속받는 클래스들은 다음과 같이 간단하게 구현할 수 있습니다<br /> <br /> <pre class='code'> 01: public class Derived : Base 02: { 03: protected override void Dispose(bool disposing) 04: { 05: if (_disposed == false) 06: { 07: if (disposing == true) 08: { 09: // 이 영역 안에서 Managed 자원을 해제 10: } 11: 12: // 이 영역 안에서 Unmanaged 자원을 해제 13: } 14: 15: base.Dispose(disposing); 16: } 17: } </pre> <br /> IDisposable은 물론이고, finalizer를 생략해도 자원 해제는 using과 GC에 대해서 정확하게 동작을 하게 됩니다. (왠지... 이벤트를 구현하는 패턴과 다소 유사하지요. ^^)<br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </span>
첨부파일
스팸 방지용 인증 번호
2973
(왼쪽의 숫자를 입력해야 합니다.)