원문 : http://csharpschool.github.io/2015/05/05/using-keyword-and-idisposable.html



C#에서는 가비지 컬렉터를 지원하므로, 메모리의 해제를 자동으로 해주지만 

우리가 사용하는 리소스가 메모리만 있는 것이 아니다. 메모리와 별개로 최대한 열 수 있는 파일 개수에 제한이 존재한다.

(이 제한에 도달하면 메모리가 남아도 파일을 열 수 없다.) 따라서 사용하지 않는 파일을 수동으로 닫아줘야한다.


즉..

var reader = new StreamReader("file.txt");

var content = reader.ReadToEnd();

reader.Close();


이렇게 닫아주면 끝일 것 같지만, Close가 실행되기 전 ReadToEnd에서 예외가 발생할 경우.. close가 불리지 않고 넘어가는 경우가 발생한다.

이를 방지하기 위해서 finally 블록을 사용해야하는데..


var reader = new StreamReader("file.txt");

try

{

    var content = reader.ReadToEnd();

}

finally

{

reader.Close();

}


이 처럼하게되면 어떤 상황에도 작동하는 finally 에 의해서 파일은 닫힐 것이다. 하지만 이런 과정은 불편하기 때문에..

C#은 using이라는 '키워드'를 제공한다.


using을 사용하면..


using(var reader = new StreamReader("file.txt"))

{

var content = reader.ReadToEnd();

}


이렇게 하면 위의 동일한 효과를 얻을 수 있다.


C#이 각 리소스를 해제하는 방법이 다 다를텐데, 어떻게 해제하는 것일까?

NET에 이런 목적으로 존재하는 인터페이스가 IDisposable 이며, Dispose 메소드를 정의하고 있는데,

IDisposable을 구현한 클래스가 using 블록을 빠져나갈 때, C#이 자동적으로 Dispose 메소드를 호출한다.


명시적인 리소스 해제가 필요한 클래스가 모두 IDisposable 인터페이스를 구현하고 있기 때문에

이런 클래스를 사용할 때는 되도록 using을 사용하자.


또 우리가 만드는 클래스도 명시적인 리소스 해제가 필요할 경우 IDisposable을 구현하는 것이 좋은 습관.



'프로그래밍 > C++++ (C#)' 카테고리의 다른 글

도구 상자가 보이지 않는다!!!  (0) 2016.02.26
C#의 where  (0) 2016.01.22
delegate  (0) 2016.01.22
typeof  (0) 2016.01.22
c# using 키워드  (0) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요