
2012/04/13 08:52
http://blog.naver.com/minsoub/60160239394
오랫동안 C++로만 작업을 하다가 C#을 대충 익혀쓰는 사람들에게 일어나는 실수.
소멸자 호출...
아래 코드에서 소멸자는 언제 불리나요?
1
2
3
4
5 |
void func() {
SomeObject obj = new SomeObject();
obj.someFunction(); } |
C#의 class 들은 대부분 new 를 통해서 생성이 되죠... 물론 아닌 것도 있긴 합니다. string 같은 것들.
그런데 delete는? Garbage Collection에 의해 이뤄지겠죠?
그리고 그 상황에 Finalize()가 호출되고 C#의 문법에 따라 소멸자를 통해 인스턴스를 정리하게 됩니다.
따라서 System.IO.FileStream 과 같은 객체의 인스턴스의 소멸자는 언제 불릴지 모르고.
소멸자에 의한 열린 파일 핸들을 닫는 행위는 언제가 될지 모르게 됩니다.
이런 부분을 C#에서 해결하기 위한 인터페이스가 IDisposable 입니다.
그리고 이 인터페이스를 구현한 클래스를 사용할 때에 편리한 것이 using 키워드입니다.
1
2
3
4
5
6
7 |
void func() {
using (SomeObject obj = new SomeObject())
{
obj.someFunction();
} } |
이렇게 작성을 하면 아래와 같은 결과입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
void func() {
SomeObject obj = null ;
try
{
obj = new SomeObject();
obj.someFunction();
}
finally
{
if (obj != null )
((IDisposable)obj).Dispose();
} } |
확실히 using이 간단해 보입니다.
어떤 부분에 의해 그렇게 구현되어 있는지 모르지만 System.Drawing.Font 와 같은 클래스도 이렇게 해야 됩니다.
어떤 클래스를 사용하실 때에는 반드시 해당 클래스가 IDisposable 인터페이스를 구현했는지 확인하시고,
IDisposable 인터페이스를 구현한 클래스라면 되도록 using 문을 사용하여 코딩하세요.
[출처] C#에서 using 사용하기|작성자 JJANG
'프로그래밍 > .Net' 카테고리의 다른 글
DllImport 사용 ini 파일에서 정보 가져오거나 Write하기 (0) | 2014.01.17 |
---|---|
많은 컨트롤을 배열에 넣어보자 (0) | 2014.01.17 |
C# 스레드사용시 메서드 이름이 필요합니다 (0) | 2014.01.17 |
[링크스크랩] partial class를 계층적으로 보이게 하는 방법 (0) | 2014.01.17 |
Queue 사용하기 (0) | 2014.01.17 |