如何在我的班级中正确实现Dispose()?

时间:2015-01-22 17:46:05

标签: c# dispose monogame

我正在寻找有关如何以及何时实施配置模式的建议 我已经阅读了有关如何实现Dispose()模式的MSDN文章。这说得通。我在课堂上实现了它,但它似乎没有对内存使用产生影响。

背景,我正在构建一个2d自上而下的游戏引擎。我有一个名为Gatherer的单位,它继承自Actor(绘制精灵和跟踪视图的基本类),它们是简单的精灵,可以用来做事。他们在5轮比赛后消失。

我使用列表来跟踪收集者,实现方式如下:

 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对象和几个Static Int。 我也有随机r;在运行时创建,但似乎没有Dispose方法。 我拥有的唯一非托管对象是2个Texture2D对象。 public Texture2D glowTexture; public Texture2D texImage;

在我的处理中,我认为我只需要处理纹理 一个问题是,如果我实际调用texImage.Dispose();它会摧毁其他仍然活着的单位的纹理。我想我可以将纹理改为Null,这不会影响现有的单位。

我有这个处理:这是否足够?如果没有,我如何验证是否正常工作?

 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 个答案:

答案 0 :(得分:4)

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

正如您所发现的,

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

除了之外,您在多个对象之间共享这些资源,因此您不希望使用纹理的对象控制它们的生命周期。

我会遵循XNA中的模式。加载内容的人也需要卸载它。在您的情况下,创建纹理(以及子对象)的任何人都应该在处理它们时处置它们。使用纹理的子对象实际上根本不需要实现IDisposable