2017-04-08 17 views
0

나는 약간 문제가구현으로 IDisposable C#

내가 게임 엔진을 개발하고있어 내 솔루션에 코드 분석을 실행하고 내 "GrapicsEngine"클래스에는 IDisposable 인터페이스를 구현했다 되었습니까는 IDisposable 인터페이스를 이해하는 데 문제가 있습니다 Bitmap 인스턴스가 포함되어 있기 때문입니다. 여기

내 클래스 멤버입니다 :

private const int BITMAP_WIDTH = 4096; 
private const int BITMAP_HEIGHT = 4096; 

private Graphics backBuffer; 
private Bitmap bitmap; 

private Color clearColor; 

private WindowSurface surface; 

private GraphicsQuality quality; 

private Viewport viewport; 

여기 내 IDispoable 지역이다

물론, 내가 제대로 이렇게하고 설치하는 방법을 알아 보려면 인터넷을 검색 한 다음 코드를 내놓았다 : WindowSurface가의 WinForm 패널입니다

#region IDisposable 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing == true) 
     ReleaseManagedResources(); 

    ReleaseUnmanagedResources(); 
} 

private void ReleaseManagedResources() 
{ 
    if (bitmap != null) 
     bitmap.Dispose(); 
    if (backBuffer != null) 
     backBuffer.Dispose(); 
} 

private void ReleaseUnmanagedResources() 
{ 

} 

~GraphicsEngine() 
{ 
    Dispose(false); 
} 

#endregion 

참고 GraphicsQuality는 열거하고 뷰포트에만 INT 값이 포함되어 있습니다.

그래서 난 그냥 몇 가지 질문이 : 내가 제대로 내 자원의 폐기

  1. 암을?
  2. 관리되지 않는 리소스 메서드에서 처리해야하는 리소스
  3. 새 클래스를 만들고 해당 클래스에 내 GraphicsEngine 클래스가 포함되어 있으면 해당 클래스도 IDisposable을 구현해야합니까?

이 주제에 대한 도움을 주시면 감사하겠습니다.

답변

3

올바른 길을 가고 있습니다. 일회용 클래스 수준의 변수를 가질 때마다 포함하는 클래스도 처분 가능해야합니다. 그리고 당신은 내가 말할 수있는 것에서 그것을 적절하게 다루고 있습니다. IDisposable 인터페이스가 포함되어 있는지 알 수 없으므로 클래스 이름 행이 표시되지 않지만 메서드를 구현 한 이후로는 상상할 수 있습니다. 추가하지 않았다면 추가하십시오.
IDisposable은 연쇄 반응 유형의 구현입니다. 변수가 일회용이고 메서드 호출에 대해서만 로컬 인 경우에는 호출이 끝날 때 변수를 처리하지만 클래스 수준에 있으면 IDisposable을 구현하고 클래스와 함께 처분합니다. 그런 식으로 수업을 사용하는 사람은 누구나 올바르게 처분 할 수 있습니다. 그래서 예를 들어

는 :

public class MyClass 
{ 
    private File txtFile = File.Create(...) 
} 

지금 누군가가 내 클래스를 사용합니다 ... 나는 내 수업에 열려있는 파일을 말한다.

private void useClass() 
{ 
    var myClass = new MyClass(); 
} 

글쎄, 파일을 열었을 때 제대로 처리되지 않았습니다.

private void useClass() 
{ 
    using (var myClass = new MyClass()) 
    { 
     //some code 
    } 
} 

는 희망이 당신의 질문에 대한 답변 ... 코드를 수정하고 그렇게처럼 사용할 수 있습니다 ...

public class MyClass : IDisposable 
{ 
    private File txtFile = new File.Create(...) 

    public void Dispose() 
    { 
      txtFile.Dispose(); 
    } 
} 

을 때 사용을 그들과 같이 사용할 수 있습니다 . 단지 메소드에 로컬 인 일회용 객체를 선언했는지 확인하십시오. 그러면 클래스에 IDisposable을 구현할 필요가 없습니다. 그 방법으로 그 객체를 처리 할 것이기 때문입니다.그러나 클래스 수준 범위에서 구현하는 경우 처리 방법이 있는지 여부에 관계없이 IDisposable을 구현하고 클래스 호출이 포함 된 경우 처리가 완료되었는지 확인해야합니다. 이해가 되니? 희망이 도움이됩니다.

+0

지금은 이해할 수 있습니다. 한가지 마지막 질문 : Sprite 클래스가 있습니다.이 Sprite 클래스에는 공용 getter 및 setter가있는 Bitmap이 포함되어 있습니다.이 호출도 IDisposable을 구현해야하며, 필요한 경우 "sprite.bitmap.Dispose"와 같은 비트 맵을 처리해야합니까? 이미지가 후자입니다. –

+0

코드 부분을 게시하면 알려 드리겠습니다. 일회용 객체를 속성 (getter/setter)을 통해 다시 전달하면 객체 자체는 일회용이며 해당 속성을 사용하는 모든 사용자는 일회용 기능과 함께 사용할 수도 있습니다. 그러나 다시 한 번, 그렇습니다. 클래스 수준에 있기 때문에 클래스에서 구현하고 처리하기를 원합니다. –

+0

감사합니다. 마지막 질문에는 애니메이션 용 프레임 목록이 있는데 프레임에는 비트 맵이 들어 있습니다. 목록을 반복하여 프레임을 처리 할 때 관리되지 않는 리소스를 삭제할 때 내 목록을 삭제해야하는 위치가됩니까? –