簡體   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