Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象声明为“的后果是什么?”;新";多次?_C#_Android_Object_Xna - Fatal编程技术网

C# 将对象声明为“的后果是什么?”;新";多次?

C# 将对象声明为“的后果是什么?”;新";多次?,c#,android,object,xna,C#,Android,Object,Xna,我正在用C#和XNA制作一款游戏,目标是Android和WindowsPhone7、7.1、8等移动设备。它将使用一个名为Minigame的对象来确定玩家将要玩的当前游戏(一个Minigame设置在农场,另一个设置在城市,等等)。创建小游戏的代码是这样设置的 public class Game1 : Microsoft.Xna.Framework.Game { //This is a global variable Minigame minigame; ...

我正在用C#和XNA制作一款游戏,目标是Android和WindowsPhone7、7.1、8等移动设备。它将使用一个名为Minigame的对象来确定玩家将要玩的当前游戏(一个Minigame设置在农场,另一个设置在城市,等等)。创建小游戏的代码是这样设置的

public class Game1 : Microsoft.Xna.Framework.Game
{
    //This is a global variable
    Minigame minigame;

    ...

    //This method loads the minigame when the player chooses one from the main menu
    //It is loaded using an instance of a class that inherits from the Minigame class
    void LoadMinigame(int number)
    {
        if (number == 0)
        {
            minigame = new MinigameOne();
        }
        else if (number == 1)
        {
            minigame = new MinigameTwo();
        }
        else
        {
            minigame = new MinigameThree();
        } 
    }
}
小游戏总是使用对象的“新”实例加载,但当小游戏完成且玩家选择另一个实例时,不会有任何形式的删除。C#是否希望我执行以下操作,或者我可以反复使用“new”而无需找到删除变量的方法(即,与下面相同的代码,减去delete命令),这样是否安全


不,.Net将为您提供它


一旦您创建了新对象并将其分配给minigame变量,它就可以被垃圾收集器使用(因为再也没有人引用它了)。一段时间后,GC将通过堆查找并删除没有引用的对象

一旦删除了对对象的所有引用,它就有资格进行垃圾收集。通过覆盖
迷你游戏
中的引用,您将删除对上一个迷你游戏对象的引用。只要没有对它的其他引用,一段时间后垃圾收集器就会将其吞掉


我建议您阅读一下,以便更好地了解对象是如何到达其生命周期的终点的。

我不知道XNA的具体情况,但我认为它必须分配一些需要释放的资源,否则您可能会在一段时间后耗尽这些资源(文件句柄、笔刷等)

虽然.NET垃圾收集器(GC)通常在管理内存方面做得很好,但它不会释放上面提到的非托管资源

您应该确保遵循正确的XNA最佳实践(无论它们是什么)

我认为,由于Microsoft.Xna.Framework.Game实现了IDisposable,所以一个块应该足以处理
Game
对象


干杯

如果对象实现了
IDisposable
,那么提到调用
Dispose可能是个好主意,因为可能会有非托管的资源要处理。我发现OP不太可能会搞乱非托管代码,并且觉得添加此级别的详细信息会分散注意力。@spender,而OP不会“弄乱”他/她自己的非托管代码,这比XNA更有可能,这是
Game
实现
IDisposable
的可能原因之一。我当然建议您直接调用
Dispose()
,或者使用
using
语句。实际上,大多数XNA开发人员将使用非托管代码,即使他们不知道。例如
SpriteBatch
纹理
,它们是
IDisposable
。这些资源需要在
游戏期间释放。UnloadContent()
minigame = new MinigameOne();

//Do something with the minigame

delete minigame; //I don't think this command exists in C#, but is there an equivalent?
minigame = new MinigameTwo();

//Do something again

delete minigame;
minigame = new MinigameThree();