Ich bin ein wenig Mühe, das Verständnis der IDisposable-SchnittstelleImplementierung von IDisposable C#
ich eine Game Engine entwickelt und haben Codeanalyse auf meine Lösung lief und gesagt worden, die IDisposable-Schnittstelle auf meiner „GrapicsEngine“ Klasse zu implementieren , weil es eine Bitmap-Instanz enthält.
Natürlich habe ich suchte im Internet zu lernen, wie man diese richtig zu tun und haben kam mit dem folgenden Code auf:
Hier ist meine Klasse Mitglieder:
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;
und hier ist mein IDispoable Region:
#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
Beachten Sie, dass WindowSurface ein WinForm-Panel ist, GraphicsQuality ein Enum ist und Viewport nur int-Werte enthält.
So habe ich nur ein paar Fragen:
- Bin ich richtig meine Ressourcen entsorgen?
- Welche Ressourcen muss ich in der Methode Unmanaged resources entsorgen?
- Wenn ich eine neue Klasse erstelle und sie meine GraphicsEngine-Klasse enthält, sollte diese Klasse IDisposable ebenfalls implementieren?
Jede Hilfe zu diesem Thema würde sehr geschätzt werden.
Ich denke, ich verstehe jetzt. Nur eine letzte Frage: Ich habe eine Sprite-Klasse, die eine Bitmap enthält, die einen öffentlichen Getter und Setter hat, sollte dieser Aufruf auch IDisposable implementieren, oder sollte ich die Bitmap einfach wie "sprite.bitmap.Dispose" bei Bedarf entsorgen? Ich stelle mir vor, es ist das Letztere. –
Posten Sie den Teil des Codes und ich werde es Ihnen sagen. Wenn Sie das Einwegobjekt durch eine Eigenschaft (Getter/Setter) zurückführen, ist das Objekt selbst entsorgbar, und jeder, der diese Eigenschaft verwendet, hat die Möglichkeit, es auch mit Einmalfunktionen zu verwenden. Aber noch einmal, ja, da dies auf Klassenebene ist, wollen Sie es immer noch in Ihrer Klasse implementieren und entsorgen. –
Ich denke, ich verstehe jetzt danke. Eine letzte Frage, ich habe eine Liste von Frames für Animationen, ein Frame enthält eine Bitmap. Wenn ich über die Rahmen verfüge (indem ich durch die Liste iteriere), wenn es darum geht, nicht verwaltete Ressourcen zu entsorgen, würde ich dann meine Liste löschen? –