实现IDisposable C#
我在理解IDisposable界面时遇到了一些麻烦
我正在开发一个游戏引擎,并在我的解决方案上运行代码分析,并被告知在我的“GrapicsEngine”类上实现IDisposable接口,因为它包含一个Bitmap实例。
当然,我搜索了互联网,以了解如何正确地做到这一点,并提出了以下代码:
这是我的class级成员:
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?
任何关于这个主题的帮助将不胜感激。
你走在正确的轨道上。 只要你有一个一次性的类级别变量,包含的类也应该是一次性的。 你可以从我所知道的那里妥善处理它。 我没有看到类名行,所以我不知道你是否包含IDisposable接口,但我想你已经实现了这些方法。 如果没有,请确保添加它。
IDisposable是一种连锁反应类型的实现。 如果变量是一次性的,并且它只是方法调用的本地变量,那么你在调用结束时处理它,但是如果它在类级别你实现IDisposable并在你正在做的时候将它与你的类一起处理。 这样任何使用你的class级的人都可以妥善处理它。
例如:假设我的课程中有一个文件打开…
public class MyClass { private File txtFile = File.Create(...) }
现在有人用我的class级。
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时被处置。 合理? 希望这可以帮助。