Dispose

C# 리소스

관리되지 않는 리소스 : 파일스트림, 네트워크연결, 데이터베이스연결 등 운영체제 리소스를 래핑하는 개체

관리되는 리소스 : 그 외에 리소스

* 관리되는 리소스는 가비지컬렉터가 관리해주지만 관리되지 않는 리소스는 가비지컬렉터가 관여할 수 없음

 => 관리되지 않는 리소스는 프로그래머가 직접 해제


ex) File을 읽고 Close호출(아래 예시대로 사용하면 안됨!!!)

var file = new StreamReader("file.txt");
var content = file.ReadToEnd();
file.Close();

만약 file이 null이어서 오류가 난다면 Close는 호출되지 않음



dispose

Dispose : 관리되지 않는 메모리를 명시적으로 해제

관리되지 않는 리소스는 IDisposable 인터페이스를 구현해둠

위 예제는 다음과 같이 수정할 수 있음

StreamReader file = null;
string content = string.Empty;
try
{
    file = new StreamReader("file.txt");
    content = file.ReadToEnd();
}
finally
{
    if(file != null)
        file.Dispose();
}



dispose 패턴의 구현


public class DisposableClass : IDisposable
{
    private bool disposed;

    public DisposableClass() {}
    ~DisposableClass()
    {
        this.Dispose(false);
    }

    public void Dispose()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this); // Finalizer를 호출되지 않게 제한하며 GC Call
    }

    protected virtual void Dispose(bool disposing)
    {
        if(disposed == false)
        {
            if(disposing)
            {
                // 여기서 리소스 해제
            }
        }
        disposed = true;
    }
}


다음과 같은 베이스에서 원하는 로직을 구현 후 StreamReader 예제와 같이 사용하면 됨




using

로직을 수행한 후 자체적으로 Dispose를 호출해주는 명령어

위 예제를 다음과 같이 축소할 수 있음

string content = string.Empty;
using(var file = new StreamReader("file.txt"))
{
    content = file.ReadToEnd();
}





Posted by @히테
,