2013-06-10 5 views
0

테이크 코드 :VB.Net SqlConnections, SqlCommands 등에서 Close() 및 Dispose()와 같은 것을 명시 적으로 호출해야합니까? 이 같은

Dim dt As New DataTable("Table") 
    Dim sda As New SqlDataAdapter(pQuery, pCon) 

    sda.SelectCommand.CommandTimeout = pCommandTimeout 
    sda.Fill(dt) 
    sda.Dispose() 

    Return dt 

과 :

Dim myconnection As SqlConnection = New SqlConnection(DBValues.m_sDBString) 
    myconnection.Open() 

    Try 
     Dim com As New SqlCommand(cmd, myconnection) 
     com.ExecuteNonQuery() 
     com.Dispose() 
    Catch ex As Exception 
     Throw ex 
    Finally 
     If myconnection.State = ConnectionState.Open Then 
      myconnection.Close() 
      myconnection.Dispose() 
     End If 
    End Try 

는 닫기()과 폐기()처럼 명시 적으로 호출 것들 과도한지고? 분명히 GC는 이것을 내부적으로 대부분 처리하지만 모든 시간 (?)을 처리하지는 않기 때문입니다. 지금까지 나는 누군가가 이것이 과도 할 때와 그렇지 않은 때를 구별하는 방법에 대한 명확하고 모호하지 않은 설명을 명시하지 않았으며, 또는 명시 적으로 이것을하는 것과 GC가 그것을 처리하게하는 것 사이의 차이를 구분하지 않았다. 누군가 설명 할 수 있을까요? 감사!

+4

연결을 닫는 'Using' 문을 사용하십시오. 또한 오류 발생시에도 객체가 삭제되도록 보장합니다. –

답변

3

예제에서보다 복잡한 작업을 수행하지 않으면 과도한 작업 일 수 있습니다.

using 키워드를 사용하면 더 간단하게 만들 수 있습니다. IDisposable을 구현하는 클래스의 객체 메소드 Dispose의 호출을 자동화합니다.

Relevant documentation on the using keyword, for VB.NET

또한 SqlConnectionDispose 방법이 Close도 방법 (당신은 당신의 코드에서와 같은 상태 유효성 검사를 실행)를 호출 있습니다.

using 대신 수동으로 Dispose을 호출해야하는 경우가 있습니다. 예를 들어 둘 이상의 컨텍스트에서 데이터 판독기를 사용하려는 경우 using을 사용하는 것이 바람직하지 않을 수 있습니다. 이러한 상황에 처했을 때 알게되고 Dispose으로 전화하면 과도하지 않습니다. 그러나 그때.

+0

기본적으로 객체를 잠깐 동안 유지하지 않아도되지만 나중에 다시 사용해야 할 수도 있습니다. – Panzercrisis

+1

'using' 키워드를 사용하면 객체는'using' 블록이 끝나자 마자 호출 된'Dispose' 메서드를 가져옵니다. 블록 다음에 개체를 사용하려고하면 이미 관리되지 않는 리소스가 해제됩니다. 그것에 대해 생각해보십시오. 객체의 사용을'using' 블록으로 제한하거나'using'을 사용하지 말고 시간이 맞다고 생각할 때'Dispose'를 호출해야합니다. – Renan

+0

그래서 Dispose는 using 블록을 사용하지 않는 경우에만 호출해야합니다. – Panzercrisis