提问者:小点点

如何在类中正确实现Dispose()?


我正在寻找关于如何以及何时实现dispose模式的建议。
我已经阅读了MSDN关于如何实现dispose()模式的文章。说得通。我在我的类中实现了它,但它似乎对内存使用没有什么影响。

有点背景,我正在建立一个2D自顶向下的游戏引擎。我有一个名为Gatherer的单元,它继承自Actor(一个用于绘制sprite和跟踪viewplane的基本类),它们是一些简单的sprite。它们在5轮比赛后消失。

我使用一个列表来跟踪Gatherer,实现方式如下:

 List<Gatherer> gatherList = new List<Gatherer>();

然后我在游戏引擎内部这样剪枝列表:

public void pruneDeadFollowers()
{
for (int i = gatherList.Count-1; i> -1; i--)            
    {
        if (gatherList[i].timeToDie) //Bool to check if unit needs to be removed this round.
        {                    
            this.dropActor(gatherList[i]); //Calls method that unsubscribes the object from triggered events.
            gatherList[i].Dispose();  //Is this needed?
            gatherList.RemoveAt(i); //Remove from list.
        }
    }
}

Gatherer对象非常简单。它主要有托管对象。
它有许多Int字段、几个List、几个Point(来自Monogame)、几个Bool对象和几个静态Int。我也有随机R;在运行时创建,但它似乎没有Dispose方法。我唯一的非托管对象是2个Texture2D对象。公共纹理2D发光纹理;公共文本二维文本图像;

在我的dispose中,我认为我只需要处理纹理。
一个问题是,如果我实际调用texImage.dispose();它破坏了其他还活着的单位的纹理。我想我可以只是使纹理空代替,这不影响现有的单位。

我有这样的想法:这足够吗?如果不是,我如何验证它是否正常工作?

 public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

// Protected implementation of Dispose pattern. 
protected virtual void Dispose(bool disposing)
{
    if (disposed)
        return;

    if (disposing)
    {                        
        glowTexture = null;
        texImage = null;
    }

    disposed = true;
}

共1个答案

匿名用户

您的实现是有效的,但还不够。

Dispose用于释放非托管资源。您的初始实现(在使用纹理后处理纹理)是正确的。

只是您在多个对象之间共享这些资源,所以您不希望对象使用纹理来控制它们的生存期。

我会遵循XNA的模式。谁加载内容也需要卸载。在您的情况下,创建纹理(因此创建子对象)的人都应该在释放纹理时释放纹理。根据我所看到的,使用纹理的子对象实际上根本不需要实现IDisposable