2010-08-02 2 views
11

나는 이전에 관련 질문을했다는 것을 알고있다. 방금 다른 생각이 들었습니다. SqlDataReaderdr 객체가 연결 또는 명령 개체처럼 새 개체가 아닙니다 때문에, cmd.ExecuteReader() 방법을 가리키는는 단순히 참조, 나는 using 내부의 독자를 넣어해야합니까 :SQLDataReader에서 사용

using (SqlConnection conn = new SqlConnection('blah blah')) 
{ 
    using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) 
    { 
     conn.open(); 

     // *** do I need to put this in using as well? *** 
     SqlDataReader dr = cmd.ExecuteReader() 
     { 
      While(dr.Read()) 
      { 
       //read here 
      } 
     } 
    } 
} 

인수는 점이다. (지금 내 이전 게시물을 기반으로, 내 이해는 IDisposable을 사용하는 모든 개체는 using에 넣어야하고 SQLDataReaderIDisposable에서 상속되므로 입력해야합니다. 내 판단에서 맞습니까?) 나는 단지 새로운 객체가 아니기 때문에 혼란 스럽습니다. 단순히 명령에 대한 참조 포인터 인 객체를 삭제하는 데 문제가 있습니까? ExecuteReader 메서드도 폐기해야 새로운 데이터 판독기 인스턴스를 생성 될 때

많은 감사

+0

는 "cmd.ExecuteReader는"방법 참조의 일종이다. "cmd.ExecuteReader()"(공지 괄호)는 메서드 호출입니다. –

답변

26

나는 당신이 실수라고 생각합니다. drcmd.ExecuteReader에 의해 반환 된 개체에 대한 참조이며 새 개체가됩니다. 귀하의 예에서는 아무 것도 dr을 처리하지 않으므로 예 : using에 있어야하거나 수동으로 처리해야합니다.

귀하의 판단은 IDisposable 구현 자 using이어야합니다. 그들은 밖에서 잘 작동 할 것입니다. using 문은 try ... finally의 문법적 설탕 일뿐입니다. IDisposable을 구현하는 것은 Dispose이되어야합니다. 특정 상태를 결정적으로 처리해야한다는 신호이기 때문입니다.

Dispose으로 전화하지 않으면 항상 문제가되는 것은 아닙니다. 일부 객체는 가비지 컬렉터에 의해 트리거되는 finalizer도 구현합니다. finalizer를 구현하지 않으면 관리되지 않는 메모리가 unreclaimed 상태가 될 수 있습니다. 신청서가 마감 될 때까지 취소되지 않은 채로 남아 있습니다. 모든 관리되는 메모리는 가비지 수집에 대해 알 수없는 경우가 아니라면 결국 회수됩니다.

다시는 작성 :

using (SqlConnection conn = new SqlConnection('blah blah')) 
using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) 
{ 
    conn.open(); 
    using (SqlDataReader dr = cmd.ExecuteReader()) 
    { 
     while (dr.Read()) 
     { 
      //read here 
     } 
    } 
} 
+0

예 저는 사용법이 단순히 try..finally 블록으로 변환된다는 것을 이해하고 있습니다. 하지만 try..finnally에 코드 덩어리를 넣는 것을 잊어 버리는 경향이 있으므로 사용하는 동안 블록을 래핑하는 습관을 만드는 것이 더 좋습니다. 답장을 보내 주셔서 감사합니다. :) – xeshu

+0

괜찮습니다 :-) 나는 SqlDataReader가 새로운 개체이거나 메서드 호출에서 반환 된 개체에 대한 참조라고 언급 할 것입니다. 메서드에 대한 참조가 아닙니다. 대문자로 그 점을 만들었고 그 점이 맞지 않기 때문에 언급하는 것. 독자와 연결/명령의 유일한 차이점은 연결/명령을 초기화했지만 독자를 초기화하지 않았기 때문입니다. 결국에는 초기화했는지 여부에 관계없이 모든 객체에 대한 참조가 남아 있습니다. –

+0

아 맞습니다. 내 잘못이야! :) – xeshu

2

당신은 사용 문에서 데이터 판독기를 포장한다.