繁体   English   中英

实现IDisposable C#

[英]Implementing IDisposable C#

我在理解IDisposable接口时遇到了一些麻烦

我正在开发一个游戏引擎,并对我的解决方案进行了代码分析,并被告知要在我的“ 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是枚举,并且视口仅包含int值。

所以我有几个问题:

  1. 我是否可以正确处理资源?
  2. 我应该在“非托管资源”方法中处置哪些资源
  3. 如果我创建一个新类并包含我的GraphicsEngine类,那么该类也应该实现IDisposable吗?

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

您走在正确的轨道上。 任何时候只要您拥有可处理的类级别变量,包含的类也应该是可处理的。 据我所知,您正在正确地处理它。 我没有看到类名称行,所以我无法确定您是否包含IDisposable接口,但是我想您已经实现了这些方法,因此我想您也可以。 如果没有,请确保添加它。
IDisposable是实现的连锁反应类型。 如果该变量是可抛弃的,并且仅在方法调用本地,则在调用结束时将其处置,但是如果在类级别,则实现IDisposable并在进行操作时将其与您的类一起处置。 这样,使用您的课程的任何人都可以正确处理它。

例如:说我在课堂上打开了一个文件...

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

现在有人在上我的课。

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

好吧,他们刚刚打开了一个文件,但没有正确处理。

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

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

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

     ~MyClass() => Dispose();
}

当使用它时,他们可以像这样使用它...

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

希望这能回答您的问题。 只需记住,是否在方法的局部声明了一个可抛弃的对象,然后就不必在类中实现IDisposable了,因为您将在该方法中处理它。 但是,如果您在类级别的范围内实现它,则无论是否有方法对其进行处置,都应实现IDisposable并检查以确保在包含类调用的处置时它已被处置。 说得通? 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM