[英]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值。
所以我有幾個問題:
任何有關此主題的幫助將不勝感激。
您走在正確的軌道上。 任何時候只要您擁有可處理的類級別變量,包含的類也應該是可處理的。 據我所知,您正在正確地處理它。 我沒有看到類名稱行,所以我無法確定您是否包含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.