2017-04-08 69 views
0

我有一个小麻烦了解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值。

所以我只是一对夫妇的问题:

  1. 我是否妥善处理我的资源?
  2. 我应该在非托管资源方法中处理哪些资源
  3. 如果我创建一个新类并且它包含我的GraphicsEngine类,那么该类是否也应该实现IDisposable?

任何有关这个主题的帮助将不胜感激。

回答

3

你在正确的轨道上。任何时候你有一个一次性的班级变量,包含班级也应该是一次性的。而且你正在从我所知道的方面正确处理它。我没有看到班级名称行,所以我不能告诉你是否包含IDisposable接口,但是我想你会在你实施了这些方法之后做到这一点。如果不确定你添加它。
IDisposable是一种链式反应类型的实现。如果变量是一次性的,并且它只是方法调用的本地对象,那么在调用结束时将其抛弃,但如果它处于类级别,则实现IDisposable并在您的类中处理它。这样,任何使用你的课堂的人都可以正确处理它。

因此,例如:说我有在我的课中打开文件...

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

现在有人使用我的课。

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

那么,他们刚刚打开一个文件,它没有妥善处理。

修改代码,它可以像这样使用...

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

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

而当使用它,他们可以使用它是这样的...

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

希望这回答你的问题。请记住,你是否声明了一个方法的本地可抛弃对象,那么你不必在你的类中实现IDisposable,因为你将在该方法中处理它。但是,如果您在类级范围内实现它,则无论您是否有方法处置它,您都应该实现IDisposable并检查以确保它在包含类调用的处置时处理。合理? 希望这有助于。

+0

我想我现在明白了。最后一个问题:我有一个Sprite类,它包含一个具有公共getter和setter的Bitmap,如果此调用也实现了IDisposable,或者我应该在需要时处理像“sprite.bitmap.Dispose”这样的位图?我认为这是后者。 –

+0

发布代码部分,我会告诉你。如果你通过一个属性(getter/setter)传递一次性对象,那么这个对象本身就是一次性的,任何使用该属性的人都可以选择将它用于一次性特征。但是,是的,因为在班级级别,您仍然希望在班级中实施和处理它。 –

+0

我想我现在明白了,谢谢。最后一个问题,我有一个动画框架列表,一个框架包含一个位图。当我处理框架(通过遍历列表)时,当涉及处置非托管资源时,这是我应该清理我的列表的位置吗? –

相关问题