我可以在同一个变量上实例化多个对象吗?

时间:2018-05-09 19:38:59

标签: c# class object

例如:

Enemy enemy;
if(enemy == null)
{
    Enemy enemy = new Enemy();
}

如果这个敌人死了,以某种方式删除实例并在上面声明的同一个变量中重新实例化。

编辑:我正在将它用于地牢爬虫控制台游戏,我希望,在你杀死一个怪物之后,你会遇到另一次遭遇。

2 个答案:

答案 0 :(得分:2)

是的,这是可能的,但您必须了解以下两行代码之间的区别。

这是分配的一个例子:

a = 10;

这是带有初始化程序的变量声明的示例。

var a = 10;

变量可以根据需要分配多次,但只能声明一次(在范围内)。

所以你绝对可以这样做:

var enemy = new Enemy(); //Declaration
enemy = new Enemy();     //Assignment
enemy = null;            //Assignment
enemy = new Enemy();     //Assignment

但你不能这样做:

var enemy = new Enemy(); //Declaration
var enemy = new Enemy();  //Declaration - will not compile

回到您的示例,工作版本可能如下所示:

class Game
{
    private Enemy enemy = null; //You have to initialize a field before you can check it, even if you're just checking for null

    public Enemy GetEnemy()
    {
        if (enemy == null)
        {
            enemy = new Enemy();  //Here I am only assigning, not declaring
        }
        return enemy;
    }
}

以上不是一种不常见的模式,使用支持字段作为缓存并在即时基础上加载它。

如果你想要的只是这样的延迟加载,你也可以考虑使用Lazy<T>类。

答案 1 :(得分:1)

删除.net中的对象是垃圾收集器的责任,因此您不必像在C ++中那样删除它们。

只要没有(根)引用,对象就会被垃圾回收器删除。因此,如果您只是重新分配变量,旧对象将不再被引用,垃圾收集器将在一段时间后处理它。

如果对象被破坏的时刻很重要(它保留并且必须释放一些重要资源),那么你必须实现#!/usr/bin/python

IDisposable