4

가능한 중복 :

C #Using 블록은 무엇이며 왜 사용해야합니까?

코드 블럭 중간에서 사용되는 using 문을 보았습니다. 이유는 무엇입니까?


6 답변


41

그만큼~을 사용하여구문은 구현하는 모든 것에 대한 범위를 정의하는 방법으로 사용할 수 있어야합니다.IDisposable. using 문은 예외가 발생할 경우 Dispose가 호출되도록합니다.

    //the compiler will create a local variable 
    //which will go out of scope outside this context 
    using (FileStream fs = new FileStream(file, FileMode.Open))
    {
         //do stuff
    }

또는 다음과 같이 사용할 수도 있습니다.

    FileStream fs;
    try{
       fs = new FileStream();
       //do Stuff
    }
    finally{
        if(fs!=null)
           fs.Dispose();
    }

MSDN에서 추가 읽기

C #은 .NET Framework 공용 언어 런타임 (CLR)을 통해 더 이상 필요하지 않은 개체를 저장하는 데 사용되는 메모리를 자동으로 해제합니다. 메모리의 해제는 비 결정적입니다. CLR이 가비지 수집을 수행하기로 결정할 때마다 메모리가 해제됩니다. 그러나 일반적으로 가능한 한 빨리 파일 핸들 및 네트워크 연결과 같은 제한된 리소스를 릴리스하는 것이 가장 좋습니다.

using 문을 사용하면 프로그래머가 자원을 사용하는 객체가 객체를 릴리스해야하는시기를 지정할 수 있습니다. using 문에 제공된 객체는 IDisposable 인터페이스를 구현해야합니다. 이 인터페이스는 개체의 리소스를 해제해야하는 Dispose 메서드를 제공합니다.


  • +1 - 좋은 답변 - 컴파일러는 실제로 using 문을 try / finally로 대체한다는 점에 유의해야합니다. - Andrew Hare

3

스트림 또는 데이터베이스에 대한 연결을 열 때 종종 사용됩니다.

try {...} finally {...} 블록처럼 동작합니다. 후~을 사용하여블록에서 괄호 안에 인스턴스화 된 IDisposable 개체가 제대로 닫힙니다.

using (Stream stream = new Stream(...))
{


}

이 예에서는 블록이 끝난 후 스트림이 제대로 닫힙니다.


3

사용은 IDisposable .. sqlconnection과 같은 모든 것을위한 신디케이션 suger를 최종적으로 시도하는 것입니다. 그것의 사용은 무언가가 그것의 밖으로 그것의 후에 삭제 된 ㄴ다는 것을 확인한다using(){}범위.

using(SqlConnection conn = new SqlConnection(connString))
{
  //use connection
}

//shorter than

SqlConnection conn = new SqlConnection(connString)
try
{
  //use connection 
}
finally
{
    conn.Dispose();
}


2

using 문은 객체가 제대로 설정되지 않았 으면 적절하게 처리되도록합니다. 기본적으로 obj.Dispose ();를 작성하는 것을 저장합니다. 변수의 범위와 사용법에 대한 시각적 안내서를 제공합니다.

만나다MSDN 페이지더 많은 정보를 위해서


2

이 사용 양식은 리소스를 확보하는 것과 관련이 있습니다. IDisposable 인터페이스를 구현하는 클래스와 함께 사용해야합니다.

예:

using(SqlConnection conn = new SqlConnection(someConnectionString))
{
     //Do some database stuff here
}

using 블록의 끝에서 conn.Dispose가 호출됩니다. 예외가 블록 내부에서 발생하더라도 마찬가지입니다. SwqlConnection 객체의 경우 연결이 항상 닫혀 있음을 의미합니다.

이 구성의 단점은 현재 무슨 일이 일어나고 있는지를 알 수있는 방법이 있다는 것입니다.

희망이 귀하의 질문에 대답하는 데 도움이?


2

코드에서 IDisposable을 구현하는 객체를 만들 때마다 코드는 위에서 보았 듯이 using 블록 내에서 생성 작업을 수행해야합니다.

이 규칙에는 한 가지 예외가 있습니다. WCF 프록시 클래스 디자인의 오류로 인해 명령문을 사용하여 프록시 클래스에 유용하지 않습니다. 간단히 말해서 프록시 클래스의 Dispose 메서드는 예외를 throw 할 수 있습니다. WCF 팀은이를 허용하지 않을 이유가 없음을 알았습니다.

불행히도, 이유를 보지 않는다고해서 거기에 있다는 것을 의미하지는 않습니다.~이다.이유없이:

try
{
    using (var svc = new ServiceReference.ServiceName())
    {
        throw new Exception("Testing");
    }
}
catch (Exception ex)
{
    // What exception is caught here?
}

암시 적 Dispose 호출이 예외를 throw하면 catch 블록이 catch합니다.예외 내에서 던져진 예외 대신~을 사용하여블록.

연결된 질문


관련된 질문

최근 질문