212

이 질문에는 이미 답변이 있습니다.

C #에서 Using 블록의 목적은 무엇입니까? 지역 변수와 다른 점은 무엇입니까?

9 답변


262

IDisposable을 구현하는 유형은 자동으로 처리합니다.

주어진:

public class SomeDisposableType : IDisposable
{
   ...implmentation details...
}

이것들은 같습니다 :

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
    if (t != null) {
        ((IDisposable)t).Dispose();
    }
}

using (SomeDisposableType u = new SomeDisposableType()) {
    OperateOnType(u);
}

두 번째는 읽고 유지하기가 더 쉽습니다.


  • 일반적으로 finally 블록은 Dispose를 호출하기 전에 무효를 검사합니다. 당신이 생성자를 호출 할 때 중요하지는 않지만 ... - Jon Skeet
  • 변수를 using 블록 밖에 선언 한 다음 using 문에서 새 인스턴스를 만들면 항목을 삭제할 수 없습니다. - John
  • 그래서 using 문은 컨텍스트가 완료되면 객체를 자동으로 삭제합니다. IDisposable을 구현하는 유형에 대해 using 문을 사용해야하는 시점은 언제입니까? 인터페이스를 구현해야하는 유형은 무엇인가요? 이와 관련하여 어림짐작이 있습니까? 아니면 각 유형을 개별적으로 확인해야합니까? - JsonStatham
  • pedantic을 사용하면 제한된 범위를 반영하기 위해 두 번째 코드 블록 주위에 중괄호가 필요합니다. - Caltor
  • 노트 :사용법 조심하십시오.using~으로 블록하다HttpClient()! 만나다이 기사. - jbyrd

90

Using전화Dispose()using코드가 예외를 던지더라도 - 블럭이 남습니다.

그래서 보통usingIO와 같은 클래스를 정리해야하는 클래스의 경우

그럼,이 블록을 사용 :

using (MyClass mine = new MyClass())
{
  mine.Action();
}

같은 일을 할 것이다 :

MyClass mine = new MyClass();
try
{
  mine.Action();
}
finally
{
  if (mine != null)
    mine.Dispose();
}

사용using길고 읽기 쉽습니다.


  • null 확인이 필요합니까? & quot; new MyClass () & quot; 뒤에 어떻게 광산을 null로 할 수 있습니까? 내가 볼 수있는 유일한 것은 OutOfMemoryException이지만 그 경우에는 try 블록을 올바르게 입력해서는 안됩니다. 편집 : 아마 사용하는 경우 일반적으로 수행되는 것을 보여주기 위해 이것을 썼을 것입니다. using 내부에는 새로운 생성자 호출이 아닌 다른 것이있을 수 있습니다 (예 : null을 반환하는 메서드 호출). - tigrou
  • 글쎄, 너는 다른 것들을 할 수있다.mine.Action(). 같은 것들mine=null. 광산을 사용하지 않고 try / catch에서 설정할 수 있습니다. - Sam

39

MSDN에서 :

.NET Framework 공통을 통해 C #   언어 런타임 (CLR), 자동으로   저장에 사용 된 메모리를 해제합니다.   더 이상 필요하지 않은 개체.   메모리의 릴리스입니다.   비 결정적; 메모리가 해제됩니다.   CLR이 수행하기로 결정할 때마다   가비지 컬렉션. 그러나 그것은   보통 한정판을 발매하는 것이 가장 좋다.   파일 핸들 및   네트워크 연결 속도 향상   가능한.

using 문을 사용하면   프로그래머가 객체를 지정할 때   사용하는 리소스가 공개되어야합니다.   그들. 오브젝트에 사용 된   성명서는   IDisposable 인터페이스. 이 인터페이스   Dispose 메서드를 제공합니다.   객체의 자원을 해제해야합니다.

즉,using문은 .NET에 지정된 개체를 해제하도록 지시합니다.using더 이상 필요하지 않으면 차단하십시오.


  • 이것은 & quot; using & quot;을 사용하는 이유를 제공하지만 @plinth는 실제로 무엇을하는지 보여줍니다. - tvanfosson
  • 과연. 이것은 & quot; C #에서 블록 사용의 목적은 무엇입니까? & quot; - Robert S.
  • @tvanfosson : 참고로, 앰퍼샌드 문자는이 주석의 시작 부분에서했던 것처럼 사용자에게 사용자가 주석을 표시하고 있음을 의미합니다. 주저 사항을 언급 할 때처럼 다른 사용자의 모든 참조 앞에이 문자를 붙일 필요가 없습니다. - raven
  • @raven : 참고로 앰퍼샌드가 아닙니다. & amp; :) - Scott Ferguson

19

using 문은 C #에서 개체를 처리하는 데 사용됩니다.IDisposable인터페이스.

그만큼IDisposable인터페이스에는 하나의 공용 메소드가 있습니다.Dispose개체를 처리하는 데 사용됩니다. using 문을 사용하면 명시 적으로 객체를 코드에 처리 할 필요가 없으며 using 문이이를 처리합니다.

using (SqlConnection conn = new SqlConnection())
{

}

위의 블록을 사용할 때 내부적으로 코드는 다음과 같이 생성됩니다.

SqlConnection conn = new SqlConnection() 
try
{

}
finally
{
    // calls the dispose method of the conn object
}

자세한 내용은 다음을 참조하십시오.C #에서 'using'문 이해하기.


5

using 블록에 코드를 배치하면 컨트롤이 블록을 떠나 자마자 해당 객체가 삭제됩니다 (반드시 수집 할 필요는 없지만).


5

또한 다음을 통해 인스턴스화 된 객체using사용중인 블록 내에서 읽기 전용입니다. 공식 C # 참조 문서를 참조하십시오.이리.


5

using (B a = new B())
{
   DoSomethingWith(a);
}

~에 해당합니다.

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}


  • 이 답변에는 오타가 포함되어 있습니다. (우리가 처음부터 클래스를 명명해야하는 이유의 또 다른 예입니다.)다른 대답이 게시물에. - RayLuo

2

실제로 IDisposable을 구현하는 멤버에게 Dispose 호출을 요구하지 않는 단순한 합성 설탕입니다.


2

using 문은 하나 이상의 리소스를 가져 와서 명령문을 실행 한 다음 리소스를 삭제합니다.

연결된 질문


관련된 질문

최근 질문