2016-05-31 7 views
1

DbConnection을 상속받은 클래스를 작성 했으므로 그 이유를 완전히 이해하지 못합니다.왜 자식 클래스에 IDisposable()을 구현해야합니까?

은 첫째 나는이 있었다 :

public class DatabaseConnection : DbConnection 
{ 
    ... 
    public override void Close() 
    { 
     // Some stuff 
    } 
    // No Dispose method 
} 

using(var db = new DatabaseConnection()) 
{ 
    // Some processing 
} 

닫기() 메소드

가 호출되지 않은, 그리고 우리는 연결이 MySQL 서버에 머물고 볼 수 있었다.


지금이 있고, 가 (정말 연결을 닫고, 서버는 OK입니다) 작동 :


public class DatabaseConnection : DbConnection, IDisposable 
{ 
    ... 
    public override void Close() 
    { 
     // Some stuff 
    } 

    public new void Dispose() 
    { 
     Close(); 
     base.Dispose(); 
     GC.SuppressFinalize(this); 
    } 
} 

using(var db = new DatabaseConnection()) 
{ 
    // Some processing 
} 
이 DbConnection 클래스를 상속하고 닫기를 무시하는 이유() 메소드가 작동하지 않습니까?

+0

Dispose 또는 Close? Dispose 메서드의 내용이 이미 있기 때문에 –

답변

1

당신은 Dispose을 무시하지 않는 reference sourceDbConnection에서 볼 수있는, 그래서 DisposeClose를 호출하지 않습니다.

DbConnectionComponent에서 상속받습니다.이 부분은 IDisposable의 구현 위치입니다. 당신은 Dispose(bool disposing) 방법은 virtualreference source에서 볼 수있는, 그래서 당신은 그것을 오버라이드 (override) :

protected override void Dispose(bool disposing) 
{ 
    base.Dispose(disposing) 
    Close(); 
} 
+0

일부 사람들은'DbConnection'에 "버그"가 있거나 적어도 문서 [https://msdn.microsoft.com/en-us/library]에 있다고 주장 할 수도 있습니다. /system.data.common.dbconnection.close(v=vs.110).aspx) : "... Close 또는 Dispose를 호출하여 연결을 닫습니다. 이는 기능상으로 동등합니다." - 앞에서 보았 듯이 상속 클래스가 해당 함수 동등성을 유지할 것이라는 보장은 없습니다 (최소한 "상속인에게주의"또는이 공동 종속성을 명시 적으로 코딩함으로써). –

+0

감사합니다. 논리가 있습니다. 그것은 매우 간단합니다()!를 보여주는 [this] (http://stackoverflow.com/questions/5243398/will-a-using-block-close-a-database-connection)과 같은 모든 질문들과 혼동 스럽습니다. –

+0

@MickaelV. 특히 (Damien이 지적한 바와 같이) 문서가 그렇게 작동한다고 말하면 혼란 스럽습니다. 귀하의 링크 된 질문에 대한 답변에 대한 의견은 유효합니다 : * 실제로 DBConnection 구현은 Dispose를 덮어 쓰지 않고 모든 연결을 닫지 않습니다. 당신이 기본 클래스에서 상속을 받고 있기 때문에 당신은 이것을 알아 차리고있을뿐입니다. –

0

using statement은 블록의 끝에서 Dispose 메서드를 호출합니다.

DbConnection도 IDisposable 인터페이스를 구현하므로 첫 번째 스 니펫의 using 블록은 상속 된 Dispose 메서드를 호출합니다.

Close 함수를 재정의했기 때문에 연결 상태가 계속 유지 될 수 있습니다. 그러나이 경우 확실하지 않습니다. 잘못된 경우 수정하십시오.