2017-04-14 5 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;」の代わりに 'PlayerShip subShip = new PlayerShip();'という行を2つ作成していますが、ProgramクラスのPlayerShipを参照してこのインスタンスへの参照を上書きしています –

+0

良い点!私はそれを変えた。あなたが正しいのは、参照を上書きするだけで新しい選手権をするのは理にかなっていません。ありがとうございました! – Icywata

+1

ヒープやスタックを心配しないでください。引用によるコピーまたは値によるコピーについての心配。それはあなたが理解する必要がある相違点です。 –

答えて

7

私の理解では、subShipとmainShipの両方が 'ヒープ'またはメモリ内の同じオブジェクトを参照しています。

PlayerShipclassの場合、同じオブジェクトに対して2つの参照があります。

PlayerShipstructの場合、割り当てはコピーを作成し、そのコピーを使用します。

は、この悪い考えそれはただのツールだ、悪いも良いでもないのです

です。

0

Playershipがクラスであるとしましょう。次に実行の状態が異なります。

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

ここで異なる参照が必要です。 1つの参照は静的オブジェクトmainShipに由来し、もう1つはインスタンス化されたオブジェクトsubShipに由来します。しかし、あなたがメソッドを呼び出した後:静的オブジェクトmainShip

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

あなたの参照、そうsubShipmainShipの両方が同じオブジェクトを参照しているが。

これは悪い考えですか?

正確には何ですか?別のオブジェクトを参照するには?いいえ、それは悪い考えではなく、かなり頻繁に使用されています。

しかし、直接あなたのオブジェクトを割り当てることは良い考えではありませんあなたが最初に割り当てられたオブジェクトを使用しない場合は(私は任意の使用を参照することはできません(私はAの行をマークし)、多分あなたは既にPlayEncounter()を実行する前subShipを使用しました、それは再び意味をなさないでしょう)。しかし、あなたが古いリファレンスを直接上書きするのであれば、それは単にRAMのスペースと実行時間の無駄でした。それは大きな違いではありませんが、それを良いアイデアと呼ぶことはできません。