문제

나는 보통 다음과 같은 코드를 사용합니다.

using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
{
   var command = connection.CreateCommand();
   command.CommandText = "...";
   connection.Open();
   command.ExecuteNonQuery();
}

command 자동으로 폐기 하시겠습니까? 또는 그렇지 않고 나는 그것을 포장해야합니다 using 차단하다? 폐기해야합니다 SqlCommand?

도움이 되었습니까?

해결책

그냥 이것을하십시오 :

using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
using(var command = connection.CreateCommand())
{
   command.CommandText = "...";
   connection.Open();
   command.ExecuteNonQuery();
}

명령에 처분을 부르지 않으면 너무 나쁘지 않습니다. 그러나 처분을 부르는 것은 그럴 것입니다 파이널 라이저에 대한 호출을 억압하십시오, 호출은 성능 향상을 처리합니다.

다른 팁

가장 안전한 정책은 항상 전화하는 것입니다 Dispose() 객체가 구현되는 경우 IDisposable, 명시 적으로 또는 사용 블록을 통해. 필요하지 않은 경우가있을 수 있지만 어쨌든 전화를 걸면 문제가 발생하지 않아야합니다 (수업이 올바르게 작성된 경우). 또한, 구현이 언제 변경 될 수 있는지 알지 못합니다. 즉, 호출이 이전에 필요하지 않은 경우, 이제는 확실히 필요합니다.

주어진 예에서는 명령에 블록을 사용하여 추가 내부를 추가하고 연결을 위해 블록을 사용하여 외부를 유지할 수 있습니다.

예, 구현이 현재 많은 일을하지 않더라도 미래에 어떻게 변경 될지 모르겠습니다 (예 : 새로운 프레임 워크 버전). 일반적으로 구현하는 모든 개체를 처리해야합니다. IDisposable 안전한쪽에 있습니다.

그러나 작업이 연기되고 전체 범위를 제어하지 않는 경우 (예 : 비동기 적으로 작동 할 때 또는 SqlDataReader 또는 그렇게), 당신은 다음을 설정할 수 있습니다 CommandBehavior 에게 CloseConnection 독자가 완료 되 자마자 연결이 제대로 닫히거나 배치됩니다.

당신은 이런 종류의 물건을 사용하여 찾을 수 있습니다 반사기 또는 dotpeek 또는 https://referencesource.microsoft.com/.

나는 작은 발굴을 가졌다 (나는 당신이 열심히 시도하지 않았기 때문에 나머지 부분을 완전히 확신 할 것을 제안 할 것입니다). 연결을 죽일 때 보이는 것처럼 보입니다. 그 연결과 함께. 또한 실제로 명령의 처분이 실제로 그렇게 많은 일을하는 것처럼 보이지 않습니다. 필드를 NULL로 설정하고 컨테이너에서 분리하고 (관리되는 메모리 누출을 방지 할 수 있음) 이벤트를 제기합니다 (이것은 중요 할 수도 있지만 누가이 이벤트를 듣고 있는지 알 수 없습니다).

어느 쪽이든,이 물건을 사용하는 블록에서 사용하거나 연결을 보유하는 객체에 폐기 패턴을 사용하여 폐기하는 것이 좋습니다 (명령을 잠시 동안 유지하려는 경우).

실제로, 당신은 건너 뛸 수 있습니다 Dispose. 자원이 없습니다. 이후로 마무리를 억제하지 않습니다 SQLCOMMAND 생성자가 그렇게합니다.

이론적으로 Microsoft는 관리되지 않는 리소스를 보유하기 위해 구현을 변경할 수 있지만 Component 그들이하기 오래 전에 기본 클래스.

내 생각에, 전화 Dispose 모두 SqlConnection 그리고 SqlCommand 모범 사례입니다. 아래 코드를 사용하십시오

using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
try{
    using(var command = connection.CreateCommand())
    {
       command.CommandText = "...";
       connection.Open();
       command.ExecuteNonQuery();
    }
}
catch(Exception ex){ //Log exception according to your own way
    throw;
}
finally{
    command.Dispose();
    connection.Close();
    connection.Dispose();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top