2017-04-14 42 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空間和執行時間。這不是一個很大的區別,但你也不能說它是一個好主意。