가능한 중복 :
C #Using 블록은 무엇이며 왜 사용해야합니까?
코드 블럭 중간에서 사용되는 using 문을 보았습니다. 이유는 무엇입니까?
그만큼~을 사용하여구문은 구현하는 모든 것에 대한 범위를 정의하는 방법으로 사용할 수 있어야합니다.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();
}
C #은 .NET Framework 공용 언어 런타임 (CLR)을 통해 더 이상 필요하지 않은 개체를 저장하는 데 사용되는 메모리를 자동으로 해제합니다. 메모리의 해제는 비 결정적입니다. CLR이 가비지 수집을 수행하기로 결정할 때마다 메모리가 해제됩니다. 그러나 일반적으로 가능한 한 빨리 파일 핸들 및 네트워크 연결과 같은 제한된 리소스를 릴리스하는 것이 가장 좋습니다.
using 문을 사용하면 프로그래머가 자원을 사용하는 객체가 객체를 릴리스해야하는시기를 지정할 수 있습니다. using 문에 제공된 객체는 IDisposable 인터페이스를 구현해야합니다. 이 인터페이스는 개체의 리소스를 해제해야하는 Dispose 메서드를 제공합니다.
스트림 또는 데이터베이스에 대한 연결을 열 때 종종 사용됩니다.
try {...} finally {...} 블록처럼 동작합니다. 후~을 사용하여블록에서 괄호 안에 인스턴스화 된 IDisposable 개체가 제대로 닫힙니다.
using (Stream stream = new Stream(...))
{
}
이 예에서는 블록이 끝난 후 스트림이 제대로 닫힙니다.
사용은 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();
}
using 문은 객체가 제대로 설정되지 않았 으면 적절하게 처리되도록합니다. 기본적으로 obj.Dispose ();를 작성하는 것을 저장합니다. 변수의 범위와 사용법에 대한 시각적 안내서를 제공합니다.
만나다MSDN 페이지더 많은 정보를 위해서
이 사용 양식은 리소스를 확보하는 것과 관련이 있습니다. IDisposable 인터페이스를 구현하는 클래스와 함께 사용해야합니다.
예:
using(SqlConnection conn = new SqlConnection(someConnectionString))
{
//Do some database stuff here
}
using 블록의 끝에서 conn.Dispose가 호출됩니다. 예외가 블록 내부에서 발생하더라도 마찬가지입니다. SwqlConnection 객체의 경우 연결이 항상 닫혀 있음을 의미합니다.
이 구성의 단점은 현재 무슨 일이 일어나고 있는지를 알 수있는 방법이 있다는 것입니다.
희망이 귀하의 질문에 대답하는 데 도움이?
코드에서 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합니다.그예외 내에서 던져진 예외 대신~을 사용하여블록.