多次声明一个对象为"new"会有什么后果?
What are the consequences of declaring an object as "new" multiple times?
我正在用 C# 和 XNA 制作一个游戏,目标是 Android 和 Windows Phone 7、7.1、8 等移动设备。它将使用一个名为确定玩家当前要玩的游戏的迷你游戏(一个迷你游戏设置在农场,另一个设置在城市等)。创建小游戏的代码是这样设置的
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();
}
}
}
小游戏始终使用对象的 "new" 实例加载,但当小游戏完成且玩家选择另一个时,永远不会有任何形式的删除。 C# 是否希望我做类似下面的事情,或者我一遍又一遍地继续使用 "new" 而没有找到删除变量的方法(即与下面相同的代码,减去删除命令)是否安全?
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();
不,.Net 会为您解决。
一旦您创建了新对象并将其分配给小游戏变量,它就符合垃圾收集器的条件(因为不再有人引用它)。一段时间后,GC 将查看堆并删除没有引用的对象。
删除对某个对象的所有引用后,它就可以进行垃圾回收了。通过覆盖 minigame
中的引用,您将删除对先前迷你游戏对象的引用。只要没有其他引用,一段时间后垃圾收集器就会将其吞噬。
我建议您阅读 "The fundamentals of garbage collection" 以更好地理解对象如何达到其生命周期的终点。
我对 XNA 不了解,但我认为它必须分配一些需要释放的资源,否则您可能会 运行 一段时间后失去它们(文件句柄、刷子、你有什么)。
虽然 .NET 垃圾收集器 (GC) 通常可以很好地管理内存,但它不会释放上述非托管资源。
您应该确保遵循正确的 XNA 最佳实践(无论它们是什么)。
我认为 using 块应该足以处理您的 Game
对象,因为 Microsoft.Xna.Framework.Game 实现了 IDisposable。
干杯
我正在用 C# 和 XNA 制作一个游戏,目标是 Android 和 Windows Phone 7、7.1、8 等移动设备。它将使用一个名为确定玩家当前要玩的游戏的迷你游戏(一个迷你游戏设置在农场,另一个设置在城市等)。创建小游戏的代码是这样设置的
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();
}
}
}
小游戏始终使用对象的 "new" 实例加载,但当小游戏完成且玩家选择另一个时,永远不会有任何形式的删除。 C# 是否希望我做类似下面的事情,或者我一遍又一遍地继续使用 "new" 而没有找到删除变量的方法(即与下面相同的代码,减去删除命令)是否安全?
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();
不,.Net 会为您解决。
一旦您创建了新对象并将其分配给小游戏变量,它就符合垃圾收集器的条件(因为不再有人引用它)。一段时间后,GC 将查看堆并删除没有引用的对象。
删除对某个对象的所有引用后,它就可以进行垃圾回收了。通过覆盖 minigame
中的引用,您将删除对先前迷你游戏对象的引用。只要没有其他引用,一段时间后垃圾收集器就会将其吞噬。
我建议您阅读 "The fundamentals of garbage collection" 以更好地理解对象如何达到其生命周期的终点。
我对 XNA 不了解,但我认为它必须分配一些需要释放的资源,否则您可能会 运行 一段时间后失去它们(文件句柄、刷子、你有什么)。
虽然 .NET 垃圾收集器 (GC) 通常可以很好地管理内存,但它不会释放上述非托管资源。
您应该确保遵循正确的 XNA 最佳实践(无论它们是什么)。
我认为 using 块应该足以处理您的 Game
对象,因为 Microsoft.Xna.Framework.Game 实现了 IDisposable。
干杯