안녕하세요, 모스크바에서 생활하고 있는 개발자 윤진입니다.
C#을 뒤적거리며 보다가 using 구문에 감탄하지 않을 수가 없었습니다.
C는 코딩시작부터 끝까지 메모리 관리에 각별히 신경써야하는데요.
C#의 using은 문제상황에서 알아서 리소스를 정리할 수 있는 메소드를 불러주니,
메모리는 물론 각종 커넥션까지 분명하게 맺고 끊을 수 있겠네요.
원래 예외상황처리로 코드가 지저분해기 마련인데 using이라면 지저분할 일도 적겠죠.
using 구문에 사용하려는 class는,
우선 리소스 정리를 위한 메소드를 만들어두어야 합니다.
- IDisposable interface를 상속하고,
- 리소스 정리를 위한 void Dispose()를 구현해 두어야 합니다.
C#에서는 '인터페이스를 Dispose 패턴으로 구현'할 수 있게 아래와 같은 템플릿을 제공하고 있습니다.
public class DisposedClass : IDisposable
{
#region IDisposable Support
private bool disposedValue = false; // 중복 호출을 검색하려면
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 관리되는 상태(관리되는 개체)를 삭제합니다.
}
// TODO: 관리되지 않는 리소스(관리되지 않는 개체)를 해제하고 아래의 종료자를 재정의합니다.
// TODO: 큰 필드를 null로 설정합니다.
disposedValue = true;
}
}
// TODO: 위의 Dispose(bool disposing)에 관리되지 않는 리소스를 해제하는 코드가 포함되어 있는 경우에만 종료자를 재정의합니다.
// ~DisposeClass() {
// // 이 코드를 변경하지 마세요. 위의 Dispose(bool disposing)에 정리 코드를 입력하세요.
// Dispose(false);
// }
// 삭제 가능한 패턴을 올바르게 구현하기 위해 추가된 코드입니다.
public void Dispose()
{
// 이 코드를 변경하지 마세요. 위의 Dispose(bool disposing)에 정리 코드를 입력하세요.
Dispose(true);
// TODO: 위의 종료자가 재정의된 경우 다음 코드 줄의 주석 처리를 제거합니다.
// GC.SuppressFinalize(this);
}
#endregion
using구문은 다음의 경우에 리소스를 정리할 수 있는 Dispose() 함수를 부릅니다.
1) using 구문이 정상적으로 완료
2) using 구문 수행 중 에러상황이 발생
using의 동작양식은 try - finally와 동일한데,
using 쪽이 보다 편리하고, 보다 빠르게 읽혀집니다.
using (DisposedClass d = new DisposedClass())
{
d.Print();
}
위의 using 구문은 아래 try-finally 구문과 동일하게 동작합니다.
DisposedClass d = new DisposedClass();
try
{
d.Print();
}
finally
{
if (d != null)
d.Dispose();
}
C#은 개발자를 위해 여러가지를 많이도 준비했군요.
'IT' 카테고리의 다른 글
[人터뷰] 개발자의 길에서 벗어나 영업으로 떠난 С군 (0) | 2017.02.28 |
---|---|
[알고리즘] 유클리드 호제법, 간단하게 증명하기 (0) | 2017.02.22 |
[C#] Linq 기초용례 기록- (1) | 2017.02.20 |
[人터뷰] 모스크바에서 만난 개발자, 알렉세이 (0) | 2017.02.18 |
[C#] delegate, anonymous delegate, lambda 용례비교 (0) | 2017.02.15 |
[C#] 필드 사용가능? - interface, abstract class, partial class, virtual method (30) | 2017.02.12 |
[C#] 속성에 대한 간단한 테스트 (0) | 2017.02.09 |
[C#] 늘 헛갈리 Modal vs Modeless (0) | 2017.02.07 |
[C#] 소수점이 있는 숫자는 float일까 double일까. (30) | 2017.02.04 |
[C#] readonly 변수를 사용하는 이유는? (30) | 2017.02.02 |