我应该实现Dispose方法吗?

时间:2014-03-23 19:08:36

标签: c# destructor xna-4.0 dispose

我班级的变量:

protected List<Texture2D> textures_ = new List<Texture2D>();
protected Color fill_color_ = Color.White;

private int move_amount_ = 1;
private const int total_move_amount_ = 40;
private float current_move_amount_ = 0;
private bool moving_ = false;

protected static Random random_ = new Random();

protected Vector2 size_ = new Vector2(40.0f, 0);

我应该实施Dispose方法,还是管理资源?特别是Texture2D个对象?

2 个答案:

答案 0 :(得分:3)

是的,你应该实现一个Dispose方法,理想情况是通过IDisposable接口,以便处理你的Texture2D对象和其他一次性用品。

您不需要实现的是finalizer(如果您忘记调用dispose方法,将由垃圾收集调用的方法),因为您只有实现自己的终结器的托管资源如果他们没有妥善处理。

最终,垃圾收集器将处理Texture2D对象,如果您不自行处理它们,但这会带来严重的性能和内存缺陷。让垃圾收集处理这将大大延迟这些对象的清理,如果你足够快地生成它们甚至可能会导致程序崩溃。

可能有一个例外:如果您只创建一个或几个类的实例,并将这些实例保留到程序终止之前,您可能无法通过实施dispose方法获得可衡量的好处。程序终止后,所有这些纹理都将被丢弃。尽管如此,手动处理这些物体仍是一种很好的做法。

编辑:
对于我不熟悉的XNA资源可能有一些特殊的考虑因素;为此我会把你推荐给bubbinator的回答

答案 1 :(得分:1)

由于您使用XNA / MonoGame(由于库的相似性而包含),您只需手动处理资源(通过Dispose方法或using块)不是来自内容管道。

有关如何处理此类内容的快速阅读,请尝试this

基本上,如果您从管道中提取内容,请拨打Content.Unload或在多个ContentManager之间划分内容。

另外,我链接的教程实际上是一组相当活跃的教程。但是,只有一个人维护网站,所以像Monogame教程这样的东西被推到了后面,有利于java教程。