100 % 관리 리소스이며 스트림도없고 대용량 리소스도없는 개체에 IDisposable을 구현하라는 요청을 받았습니다.
대규모 리소스와 관리되지 않는 리소스를 적절하게 폐기하는 것이 중요하다는 것을 이해합니다. 그러나 방정식의 다른 측면은 어떻습니까?
IDisposable 구현의 이점이없는 개체 (작은 완전 관리 개체)의 경우 , GC.SuppressFinalize는 어떤 부정적인 영향을 미칠 수 있습니까?
댓글
답변
GC.SuppressFinalize
의 유일한 목표는 다음과 같습니다.
종료자가 관리되지 않는 리소스를 IDisposable.Dispose 구현에 의해 이미 해제되었습니다.
개체를 폐기 한 후에는 질문에 대한 답과 같이 GC.SuppressFinalize(this);
를 호출해야합니다. 언제 GC.SuppressFinalize ()를 사용해야합니까? “. 코드 분석 “ CA1816 규칙도 유용합니다.
이제 IDisposable
를 구현합니다. 관리되지 않는 리소스가없는 개체는 매우 이상하고 의심스러워 보입니다. 그 사람이 당신에게 준 유일한 이유는 IDisposable
은 특정 경우에 무언가를 개선 할 것입니다. 실제로 수행 할 이유는 없습니다.
성능 문제를 일으킬 수 있습니까? 말하기 어렵습니다. 특정 경우에 따라 다릅니다.
다른 문제가 있나요? 물론입니다. IDisposable
구현이 힘들다는 사실을 고려하지 않고이 방법을 너무 많이 사용하면 코드를 읽을 수없고 유지 관리가 불가능 해집니다.
public int ComputePrice(Rebate rebate) { using (var currentCurrency = this.User.FindCurrency()) { using (var priceWithoutRebate = this.GetPurePrice()) { using (var canApplyRebate = rebate.CanApplyTo(this)) { if (!canApplyRebate) { return priceWithoutRebate; } using (var priceWithRebate = priceWithoutRebate.Apply(rebate)) { return priceWithRebate; } } } } }
댓글
- 글쎄요. 연결 / 명령 ADO.NET 코드의 누출로 인해 스트림 누출 문제가 발생했으며 이로 인해 막대한 리소스 누출이 발생했습니다. 모든 항목에 IDisposable을 구현하면 문제가 해결 될 수 있다는 사실을 알고 있었기 때문에 문제가 해결되었습니다. 대부분의 개체에 구현하면됩니다.
- @AndrewHoffman : 그럴듯한 설명처럼 보입니다. 하지만 여전히 ' 현재 관행을 정당화하지 않습니다.
답변
IDisposable 클래스에서 헤비급 ( “고통스러운”) Dispose + Finalizer 패턴을 사용할 필요가 없습니다. if 클래스가 봉인되고 클래스에 관리되지 않는 리소스가 없습니다.
이 경우 공용 Dispose()
, 종료자가없고 클래스가 봉인되었습니다.
클래스 봉인의 이유는 “하위 클래스에 관리되지 않는 리소스가있는 경우 어떻게해야합니까?”라는 문제를 방지하기 위해서입니다. 및 “미래에 자식 클래스에 관리되지 않는 리소스가 있다면 어떻게 될까요?”
이전 Microsoft의 Joe Duffy는 및 모든 순열 하위 집합 구현
이 기사의 기고자는 Herb Sutter, Brian Grunkemeyer, Jeff Richter 및 기타 C # 유명인입니다. 이 기사는 MSDN에 제시된 것보다 훨씬 더 심층적입니다.
아아, Joe Duffy의 새 블로그 엔진은 2005 년의 원본 기사를 잘 보존하지 못했기 때문에 다소 엉망인 것 같습니다. 링크는 다음과 같습니다. http://joeduffyblog.com/2005/04/08/dg-update-dispose-finalization-and-resource-management/
Joe Duffy의 기사 전체가 포함 된 MS-Word 문서를 훨씬 더 잘 첨부 할 수 있으면 좋겠습니다. 체재. 🙁
IDisposable
를 추가하면 메모리 사용량이 향상된다는 것을 보여주는 프로파일 링 및 벤치마킹 결과를 요청한 사람에게 물어볼 수 있습니까?IDisposable
를 구현할 수 있습니다. 'IDisposable
구현을 요청한 사람이 소멸자를 만들어야한다는 뜻인지 모르겠습니다. 물론 클래스에 소멸자가 없으면GC.SuppressFinalize
에 의미가 없습니다. 클래스에 소멸자가있는 경우Dispose
메서드가 실행될 때GC.SuppressFinalize(this)
라고 말해야합니다. 그렇지 않으면 인스턴스가 쉽게 가비지 수집되지 않고 종료 자 대기열에 대기하고 2 세대 수집에서만 수집됩니다.