2017-04-14 69 views
3

所以我不能以一种非常易于理解的方式找到这个问题的具体答案。所以如果这是一个愚蠢的问题,请和我一起裸露。C#内存/对象理解

如果我实例化一个对象,如:

public class Program 
{ 
    public static PlayerShip mainShip = new PlayerShip(); 

然后在另一个类我做的:

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


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

我的理解是,无论subShip和mainShip在现在引用相同的对象“堆“或内存。这是正确的,也是...这是一个坏主意?我非常喜欢初学者(只有1-2周),所以任何指导都将非常感激。

谢谢! -Brandon

+1

为什么'PlayerShip subShip = new PlayerShip();'而不是'PlayerShip subShip'的行;'您正在创建两个实例,但您正在使用Program类的PlayerShip引用覆盖此实例的引用 –

+0

好点!我改变了它。你是对的,如果我只是重写参考文献,那么做新球员是没有意义的。谢谢! – Icywata

+1

不要担心堆或堆栈。担心通过引用或按值复制;这是您需要了解的相关差异。 –

回答

7

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

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

如果PlayerShipstruct那么不,分配将创建一个副本并将使用该副本。

这是一个坏主意

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

0

我们假设Playership是一个类。然后你有不同的执行状态:

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

现在你必须有不同的引用。一个引用来自静态对象mainShip,另一个引用来自刚刚实例化的对象subShip。但是你调用该方法后:

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

您参考静态对象mainShip,这样既subShipmainShip都引用同一个对象。

这是一个坏主意吗?

究竟是什么?引用另一个对象?不,这不是一个坏主意,而且经常使用。

但它不是一个好主意,你的对象直接分配(我标有一个行),如果你从来没有使用首先分配的对象(我看不出有什么用,也许你已经在执行PlayEncounter()之前使用subShip ,那么它会再次有意义)。但是如果你没有使用它,你直接覆盖旧的参考,这只是浪费了RAM空间和执行时间。这不是一个很大的区别,但你也不能说它是一个好主意。