C#内存/对象理解

时间:2017-04-14 10:30:43

标签: c#

如果我实例化一个像:

这样的对象
public class Program
{
    public static PlayerShip mainShip = new PlayerShip(); 
}

然后在另一堂课中我做了:

public class RandomEncounters
{
    var subShip = new PlayerShip();

    public void PlayEncounter()
    {
        subShip = Program.mainShip;
    }
}

我的理解是subShipmainShip现在都在引用“堆”或内存中的同一个对象。这是正确的,这也是一个坏主意吗?

2 个答案:

答案 0 :(得分:8)

  

我的理解是subShip和mainShip现在都在引用“堆”或内存中的相同对象。

如果PlayerShipclass,那么是,您将对同一个对象有两个引用。

如果PlayerShipstruct,那么编号将创建一个副本并使用该副本。

  

这是一个坏主意

这既不好也不好,这只是一种工具。

答案 1 :(得分:0)

让我们假设球队是一个阶级。然后你有不同的执行状态:

public class RandomEncounters
{
    PlayerShip subShip = new PlayerShip();    //a

现在你需要不同的参考资料。一个引用来自静态对象mainShip,另一个来自刚刚实例化的对象subShip。但在你打电话给方法之后:

    public void PlayEncounter()
    {
        subShip = Program.mainShip;
    }
}

您引用静态对象mainShip,因此subShipmainShip都引用同一个对象。

  

这是一个坏主意吗?

到底是什么?要引用另一个对象?不,这不是一个坏主意,而且经常使用它。

但是,如果你从不使用第一个分配的对象,那么直接分配你的对象(我用a标记了这一行)并不是一个好主意(我无法看到任何用途,也许你使用了{{1}在执行subShip之前,它已经有意义了。但如果你没有使用它,你直接覆盖旧的引用,这只是浪费RAM空间和执行时间。这不是一个很大的区别,但你也不能把它称为好主意。