我有一个小麻烦了解IDisposable接口实现IDisposable的C#
我正在开发一个游戏引擎,并已在我的解决方案运行代码分析和被告知要落实对我的“GrapicsEngine”类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区域:
#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
请注意,WindowSurface是一个WinForm面板,GraphicsQuality是一个枚举,Viewport只包含int值。
所以我只是一对夫妇的问题:
- 我是否妥善处理我的资源?
- 我应该在非托管资源方法中处理哪些资源
- 如果我创建一个新类并且它包含我的GraphicsEngine类,那么该类是否也应该实现IDisposable?
任何有关这个主题的帮助将不胜感激。
我想我现在明白了。最后一个问题:我有一个Sprite类,它包含一个具有公共getter和setter的Bitmap,如果此调用也实现了IDisposable,或者我应该在需要时处理像“sprite.bitmap.Dispose”这样的位图?我认为这是后者。 –
发布代码部分,我会告诉你。如果你通过一个属性(getter/setter)传递一次性对象,那么这个对象本身就是一次性的,任何使用该属性的人都可以选择将它用于一次性特征。但是,是的,因为在班级级别,您仍然希望在班级中实施和处理它。 –
我想我现在明白了,谢谢。最后一个问题,我有一个动画框架列表,一个框架包含一个位图。当我处理框架(通过遍历列表)时,当涉及处置非托管资源时,这是我应该清理我的列表的位置吗? –