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();
}