实现IDisposable C#

问题描述 投票:0回答:2

我在理解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是一个枚举,而Viewport只包含int值。

所以我只有几个问题:

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

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

c# bitmap game-engine idisposable
2个回答
2
投票

你走在正确的轨道上。只要你有一个一次性的类级别变量,包含的类也应该是一次性的。你可以从我所知道的那里妥善处理它。我没有看到类名行,所以我不知道你是否包含了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并检查以确保它在包含类调用dispose时被处置。合理?希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.