2016-07-14 7 views
0

はのは、私は、オブジェクトを作成するとしましょう:オブジェクトを作成すると古いオブジェクトが削除されますか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CreateObjOnobj 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     testcreate myobjecttotest; 
     myobjecttotest = new testcreate(); 
     myobjecttotest.num = 20; 
     myobjecttotest.bill = true; 
     myobjecttotest = new testcreate(); 
     Console.WriteLine(myobjecttotest.bill.ToString()); 
     Console.ReadKey(); 
    } 
} 
class testcreate 
     { 
     public int num = 0; 
     public bool bill = false; 
     } 

} 

このコードは自動的にオブジェクトを削除し、メモリに損失することなく、新しいものを作成しています?

ありがとうございました

+0

はいを​​指しています。これは、JavaやC#のようなガベージコレクションの言語です:)あなたは2つ目の "myobjecttotest"を作成しました。最初のものはガベージコレクションのために利用可能です。 – paulsm4

答えて

5

正確ではありません。

実際には、最初のオブジェクトを指す変数を変更して、2番目のオブジェクトを指すようになります。その瞬間から、もう誰も最初のオブジェクトを指していません。

.NETには自動メモリ管理機能が搭載されているため、ガベージコレクタは「ルート」のないオブジェクト(定期的に参照を保持していないオブジェクト)を定期的にチェックします。このような「孤立した」オブジェクトをメモリから削除します。

しかし、ガベージコレクションがいつ発生するかについては、何も仮定することはできません。それは後で起こるでしょう、それはあなたが知っているすべてです。

一般に、2番目のオブジェクトを作成し、2番目のオブジェクトを指すように変数を変更すると、2つのオブジェクトがメモリに格納されます。時には後で、最初のオブジェクトがガベージコレクタによって削除されます。

2

基本的にはいですが詳細はありません。

変数を再割り当てすると、previosオブジェクトへの参照が失われます。しかし、ガベージコレクタがそれをキックしない限り、インスタンス自体はまだ存在します。とにかく、管理されていない参照が処理されていない限り、それについてはほとんど気にしません。何らかの方法でリリースしなければならないCOMオブジェクト。だから、同じことは、あなたがクラスのインスタンスを作成するときのように発生し、その変数のスコープ「のまま」:これは、メソッドに変数を残して、そのMyClassのインスタンスへのすべての参照が削除されます場合は

void MyMethod() 
{ 
    var myVar new MyClass(); 
} 

をし、ガベージコレクションのマークが付けられています。しかし、いつこれが起こるかはわかりません。

1

はい、そのオブジェクトを指す別のインスタンスがない限り、自動的にガベージコレクトされます。例えば

我々は最初のインスタンスのポインタ値を付与するtestcreateの別のインスタンスを作成しました。

testcreate myobjecttotest = new testcreate(); 
testcreate myobjecttotest2 = myobjecttotest; 

だから我々はmyobjecttotest = new testcreate()

を再インスタンスならば、以前のオブジェクトがmyobjecttotest2以降に削除されることはありませんが、現在それ

+0

多くのありがとうございました! – Jablonovo

関連する問題