2011-07-31 2 views
3

프로젝트에 대한 전체 코드 분석을 실행 중이며 500 문제가 있다고합니다. 지금은 300으로 낮추었지만 해결책을 찾을 수없는 문제로 고민하고 있습니다.이 시나리오에서 코드 분석 "CA2000"규칙을 해결 하시겠습니까?

규칙 CA2000 주 :이 범위를 벗어에 일회용 객체가 명시 적으로 모든 참조하기 전에 배치되지 않은 경우

는 객체가 불확정 한 번에 배치 될 가비지 컬렉터의 파이널을 실행할 때 그 물체. 개체의 종료 자 실행을 방해하는 예외적 인 이벤트가 발생할 수 있으므로 개체를 대신 명시 적으로 처리해야합니다.

위와 연결된 페이지에서 규칙에 대한 추가 정보를 찾을 수 있습니다. 규칙에 실패

코드이있다 :

internal Window(Game game, Control parent, string title, bool visible) 
    : base(game, parent, visible, new ScreenspaceRectangle(game, Color.Black, Vector.Zero, Vector.Zero)) 
{ 
} 

그 설명은 다음과

CA2000 : Microsoft.Reliability : 방법에서는 'Window.Window (게임, 제어 문자열, 부울) '에 대한 모든 참조가 범위를 벗어나기 전에'새로운 ScreenspaceRectangle (game, Color.Black, Vector.Zero, Vector.Zero) '객체에 System.IDisposable.Dispose를 호출합니다.

이 문제는 생성되는 개체 주위의 "using"문을 사용하여 정상적으로 해결 될 수 있음을 이해하며 항상 적절히 처리되도록합니다. 그러나이 경우 어떻게 해결할 수 있습니까?

+1

ScreenspaceRectangle을 폐기해야하는 이유는 무엇입니까? –

답변

3

Window 클래스는 사용자 정의 클래스라고 가정하면, 당신은 생성자 외부에서 필요로하고 IDisposable을 구현하고 Dispose 방법에 ScreenspaceRectangle의 인스턴스를 처분하는 경우 기본 클래스 생성자가 ScreenspaceRectangle의 참조가 저장되어 있는지 확인해야합니다.

그렇지 않으면 개체가 기본 클래스 생성자에 처리되고 있는지 확인하십시오.

1

C#/vb.net의 한 가지 귀찮은 제한 사항은 체인 된 생성자 또는 필드 초기화자가 try-catch 또는 try-finally 블록에 래핑되지 않도록한다는 것입니다. Foo 객체를 생성 할 때 Foo가 처분 할 책임이있는 다른 IDisposable 객체를 생성해야하는 경우 Foo의 생성자, 해당 하위 유형 또는 해당 하위 객체에서 예외가 발생하면 해당 객체가 삭제 될 수 있습니다. 슈퍼 타입. 이 문제를 해결하는 가장 확실한 방법은 "disposables manager"인스턴스를 생성하고 생성자 체인을 통해 전달하는 팩터 리 메서드로 래핑 된 보호 된 생성자를 사용하는 것입니다. IDisposable을 생성하는 것이면 그것을 disposables 관리자에 추가해야합니다. 생성자가 예외를 throw하면 disposables 관리자는 등록 된 모든 disposables를 삭제합니다.

이 접근법의 한 가지 이점은 중첩 된 IDisposable을 정리하는 코드로 처리 할 수 ​​있으므로 개체 생성 및 정리 코드가 동기화되지 않을 위험을 최소화 할 수 있다는 것입니다. 한 가지주의 할 점은 disposables 관리자를 추적하기 위해 thread-static 필드를 사용하거나 그렇지 않으면 생성자 체인의 모든 단계를 통과해야한다는 것입니다. 전 접근 방식은 칙칙한 느낌이 들지만 현장 초기화 도구로 IDisposable 개체를 안전하게 만들 수 있다는 이점이 있습니다.

관련 문제