2010-07-06 3 views
7

나는 이것을 내 머리에서 정말로 꺼내고 싶다. 아래 코드를 참조하십시오 :C# using statement

using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable")) { 
    List<string> resultsList = new List<string>(); 
    foreach (DataRow dataRow in resultTable.Rows) { 
     resultsList.Add(dataRow[0].ToString()); 
    } 
    return resultsList; 
} 

데이터 테이블이 삭제 되었습니까? 누군가 try/catch/finally 블록으로 어떻게 변환되는지 설명 할 수 있습니까? 예외가 발생하면 Dispose 메서드는 계속 호출되지만 반환 문은 어떻게됩니까?

또는 난 그냥 코드를 아래 사용해야합니다

List<string> resultsList = new List<string>(); 
using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable")) { 
    foreach (DataRow dataRow in resultTable.Rows) { 
     resultsList.Add(dataRow[0].ToString()); 
    } 
} 
return resultsList; 

아마, 두 번째가 사용되어야하지만, 난 그냥 :) 깨달음이 필요합니다. 설명 해주십시오. 감사.

+1

당신의 폐기에 관계없이 호출됩니다 원하는 목적지 수익을 넣습니다. '사용하기'는 당신의 친구입니다! – Chris

답변

5

using 문은 단지 문법 설탕이며, 그것은/finally 블록 시도로 번역됩니다 :

당신이 수익을 보장하려면

오류가 발생하는 경우에도 발생, 당신은 같은 것을 할 싶어요. 코드로 시작하여 C# 컴파일러가 using 블록을 try/finally 블록으로 변환하는 방법은 다음과 같습니다.

 try 
     { 
      DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable"); 
      List<string> resultsList = new List<string>(); 
      foreach (DataRow dataRow in resultTable.Rows) 
      { 
       resultsList.Add(dataRow[0].ToString()); 
      } 
      return resultsList; 
     } 
     finally 
     { 
      resultTable.Dispose(); 
     } 

코드에서 알 수 있듯이 returnTable에 관계없이 resultTable은 확실하게 처리됩니다. using 블록은 객체가 스코프 다음에 배치되도록합니다.

첫 번째 코드는 나에게 잘 보이기 때문에 바꿀 필요가 없습니다.

1

두 경우 모두 DataTable이 처리됩니다().

으로 번역되었으며 Disposefinally에서 호출되었습니다. 마지막으로, 이름에서 알 수 있듯이 return으로 전화를 걸더라도 호출됩니다.

4

Using 예외를 캐치하지 않으면 단지 .Dispose() 호출을 보장합니다. 항상이 평가됩니다

ResourceType resource; 
try 
{ 
    resource = new ResourceType(); 
    /* The insides of the using block */ 
} 
finally 
{ 
    resource.Dispose(); 
} 

.Dispose() 전화 :

using (ResourceType resource = new ResourceType())이 동일합니다 때문에

입니다. Dispose 호출은 심지어 using 블록 ("정말로"반환되기 전에) 내에 반환하면 평가됩니다. Dispose 호출은 예외가 발생하는 경우에도 평가됩니다.

그러나 예외가 throw 된 경우 .Dispose()이 항상 인 예외는 제외하고 그 예외적 인 코드 행은 평가되지 않습니다.

이와 같이 예외가 발생하면 return은 두 진술 문에서 반환되지 않지만 DataTable은 여전히 ​​처리됩니다.

List resultsList = new List(); 
try 
{ 
    using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable")) 
    { 
     foreach (DataRow dataRow in resultTable.Rows) 
     { 
      resultsList.Add(dataRow[0].ToString()); 
     } 
    } 
} 
catch 
{ 
} 
return resultsList; 
1

두 예제 모두에서 Dispose이 호출됩니다. 이것은 using 문이 try/finally 블록으로 확장되기 때문입니다.

C# Language Specification (8.13 The using 문)을 참조하여 다양한 시나리오 (참조 유형, null 허용되지 않는 값 유형 및 동적 유형)를 확인하십시오. DataTable 이후

가 참조 형, 첫 번째 샘플은 다음으로 확장됩니다

{ 
    DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, "SELECT * FROM MyDBTable"); 
    try { 
     List<string> resultsList = new List<string>(); 
     foreach (DataRow dataRow in resultTable.Rows) { 
      resultsList.Add(dataRow[0].ToString()); 
     } 
     return resultsList; 
    } 
    finally { 
     if (resultTable != null) ((IDisposable)resultTable).Dispose(); 
    } 
}