기계는 거짓말하지 않는다

C# using문, Dispose 본문

C#

C# using문, Dispose

KillinTime 2021. 6. 15. 12:03

일반적인 using문의 용도

1. 네임스페이스에서 형식 사용을 허용 (ex. using System;)

2. 네임스페이스나 형식에 대한 별칭 (ex. using MSBOX = System.Windows.Forms.MessageBox;)

 

그러나 파일 및 글꼴과 같은 관리되지 않는 리소스 해제를 위한 IDisposable 개체가

제대로 처리될 수 있게 만드는 데도 사용한다.

 

IDisposable 인터페이스는 관리되지 않은 리소스 해제를 위한 메커니즘을 제공하고,

가비지 컬렉터는 해당 개체가 더 이상 사용 되지 않을 때 관리 되는 개체에 할당 된 메모리를 자동으로 해제 한다.

IDisposable 인터페이스는 Dispose 함수를 구현해야한다.

 

Dispose 함수는 주로 관리되지 않는 리소스를 해제하는 데 사용한다.

 

IDisposable interface

관리 되지 않는 리소스를 직접 사용 하는 class를 만들 때 다음과 같이 구현한다.

class TempClass : IDisposable
{
    // Dispose 함수가 호출 됐는지
    bool disposed = false;
    // SafeHandle 인스턴스화
    SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);

    // 호출 가능한 Dispose 함수
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // Dispose 패턴 구현
    protected virtual void Dispose(bool disposing)
    {
        if (disposed)
            return;

        if (disposing)
        {
            handle.Dispose();
            // 관리 되는 다른 객체 해제
            //
        }

        disposed = true;
    }

    ~TempClass()
    {
        Dispose(false);
    }
}

 

일반적인 Dispose 사용

TempClass tc = null;
try
{
	tc = new TempClass();
	// 다른 작업들..
}
finally
{
	if (tc != null) tc.Dispose();
}
// 다른 작업들..

 

이를 using문을 사용하여 간단하게 바꿀 수 있다.

using (TempClass tc = new TempClass())
{
    // 다른 작업들..
}

해당 using문의 블록을 벗어나면 자동으로 자원 할당을 해제한다.

 

단, IDisposable 인터페이스 구현이 되어있지 않다면,

"using 문에 사용된 형식은 암시적으로 'System.IDisposable'로 변환할 수 있어야 합니다" 라는 오류 구문을 볼 수 있다.

Comments