2014-02-19 1 views
3

중첩 된 using을 처음 사용할 것입니다. 이 일을 제대로하고 있습니까? 다음은 코드입니다 :좋은 아이디어로 중첩 된

public Boolean AddToDigitalAssets(string fileName) 
{ 
    ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 
    Boolean result = true; 
    using (SqlConnection cnn = new SqlConnection(_ConnectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
      { 

      } 
     } 
    } 
    return result; 
} 
+0

예, 잘못되었습니다. 잘 작동합니다. –

답변

4

네, 그것은 완벽하게 Valid하고 좋습니다. 당신도 먼저 다음과 같이 블록을 사용하기위한 컬리 괄호를 제거 할 수 있습니다

". 자원의 폐기를 보장합니다 ... 심지어 처리되지 않은 예외의 경우"

using (SqlConnection cnn = new SqlConnection(_ConnectionString))    
using (SqlCommand cmd = new SqlCommand()) 
{ 

} 
2

은 Using 블록

소금물로 "보증"하십시오. 많은 것들이 자원 처분을 막을 수 있습니다. 사용하는 블록에 무한 루프가 포함되면 어떻게 될까요? 또는 블록이 예외를 throw하면 스택의 적대적인 예외 필터가 무한 루프가되어 using 문과 관련된 finally 블록에 제어가 반환되지 않습니다. 또는 블록이 Environment.FailFast를 호출합니까? 처분이 실행되는 것을 막을 수있는 많은 것들이 많이 있습니다. 그것의 정확성을 위해 처분에 의존하는 프로그램을 작성하지 마십시오. 부족한 자원을 다른 사람들이 사용할 수 있도록 풀로 반환하는 공손함을 처리해야합니다.

또한이 지점이 명확해야합니다. 진정한 처리되지 않은 예외는 C#의 구현 정의 동작입니다. using 블록의 finally 절은 예외가 사용 블록 내에서 throw 된 다음 다른 곳에서 처리되는 상황을 처리하기위한 것이고 예외가 블록 내부에서 처리되어 절대로 처리되지 않는 상황을 처리하지 않습니다. 그런 일이 발생하면 어떤 일이 발생하는지 결정하는 것은 전적으로 구현에 달려 있습니다. C# 언어는 절대로 처리되지 않는 예외를 throw하는 프로그램의 동작에 대해 총 0 개의 약속을 만듭니다. 리소스가 삭제 될 수 있습니다. 그들은 그렇지 않을 수도 있습니다. 예기치 않게 파괴 될 건물에 있습니다. 당신은 정말로 요리를 씻어서 깔끔하게 정리하는데 시간을 보내고 싶습니까?

여러 중첩 Using 블록에 어떤 이점이 있습니까?

예.

하나의 Using 블록은 이미 포함 된 모든 리소스가 삭제된다는 것을 보장합니까?

아니요. 실제로 using 문에서 언급 한 리소스 만 정리됩니다. 그래서 그들을 둥지 짓는 것입니다.

내부적으로 외부 리소스와 동일한 리소스를 해제해야하므로 기술적으로 필요하지 않은 경우가 있습니다. 그러나 블럭을 사용하여 둥지를 틀지는 것은 아무런 상처를주지 않으며 독자가 무슨 일이 일어나는지 분명하게 알려줍니다. 여기서 가장 좋은 방법은 정리하려는 모든 리소스에 대해 하나의 명령문을 사용하는 것입니다.

관련 문제