반응형

C# Using 문 

블락  벗어나면 자동 Dispose()되고 예외 상황에서도 Dispose 처리가 된다

근대 번역이 뭔가 되게 이상한데..;




출처 :  https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/using-statement

예제

다음 예제에서는 using 문을 사용하는 방법을 보여 줍니다.

C#
using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

주의

File  Font는 관리되지 않는 리소스에 액세스하는 관리되는 형식의 예입니다(이 경우 파일 핸들 및 장치 컨텍스트). 다른 많은 종류의 관리되지 않는 리소스 및 이를 캡슐화하는 클래스 라이브러리 형식이 있습니다. 그러한 모든 형식은 IDisposable 인터페이스를 구현해야 합니다.



일반적으로 IDisposable 개체를 사용할 경우 using 문에서 선언 및 인스턴스화해야 합니다. using 문은 올바른 방법으로 개체에서 Dispose 메서드를 호출하며, (앞서 설명한 대로 사용하는 경우) Dispose가 호출되자마자 개체 자체가 범위를 벗어나도록 만듭니다. using 블록 내에서 개체는 읽기 전용이며 수정하거나 다시 할당할 수 없습니다.


using 문을 사용하면 개체에서 메서드를 호출하는 동안 예외가 발생하더라도 Dispose가 호출됩니다. try 블록 내부에 개체를 배치하고 finally 블록에서 Dispose를 호출해도 동일한 결과를 얻을 수 있습니다. 실제로 컴파일러는 이 방법으로 using 문을 변환합니다. 이전의 코드 예제는 컴파일 시 다음 코드로 확장됩니다(개체의 제한된 범위를 만드는 여분의 중괄호 참고).

C#
{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}






여러분, using 키워드에 대해 아시나요?
보통 Namespace 를 Import 할때 쓰이죠.

using System.IO; public static class F { public bool Exist(string path) { return File.Exist(path); } }

이런식으로요! 네이버 코드 컴포먼트가 언어를 잘 인식 못하는거 같은데 기분 탓이려나..

하지만, 제가 알아낸 using 기능은 네임스페이스의 Import 외에도 2가지 용도가 더 있습니다!

먼저, 첫번째!
IDispose 인터페이스에게 상속 받은 클래스들을 사용할 때 쓰입니다.
설명을 뭐라 해야할지 모르겠군요.
IDispose 인터페이스를 상속한 클래스들은 Dispose() 메서드가 있는데요. using 을 사용하면 using 문 밖으로 나가는 순간 그 클래스를 자동으로 Dispose() 처리 해 줍니다. 예시를 볼까요?

using (BinaryReader sr = new BinaryReader(new FileStream(File.Open(@".\test.txt"))) { MessageBox.Show(sr.ReadString()); }

진짜로 언어 인식을 잘 못하는거 같은데.
이런식으로요! 자동으로 Dispose 를 해주니 메모리 관리하기에 더 효율적이죠..! 제가 찾은 마지막 하나!
클래스(class) 나 구조체(struct), 인터페이스(interface), 열거자(enum)를 줄여서 사용하고자 할때 도 사용 됩니다.
이것 역시 제가 설명을 잘 못하겠네요. 일단 예시를 보시죠!
이건 네임스페이스 Import 하듯이 사용하시면 됩니다.

using Environ = System.Environment;

언어를 인식 못하는게 맞는거 같다.
이런식으로요! 이렇게 해 두시면

System.Environment.StartupPath

이런식으로 호출 해야 하는것을

Environ.StartupPath

이렇게 호출할 수 있습니다..!
다른 예시도 하나 보여 드리죠.

using Dis = System.IDispose; public class Test : Dis // 원래는 System.IDispose 이렇게 했어야 했으나 using 을 사용해서 줄였으므로 Dis 로 사용 가능. { public void Dispose() { base.Dispose(); } }

이런식으로요..!

그럼 전 이만 물러 나겠습니다.
좋은 정보 되셨으면 좋겠네요!


반응형

+ Recent posts