2009-11-18 93 views
1

您好,我在引用類型的內存分配方面有一些疑問。請澄清我在以下代碼之間註釋的問題。如何將內存分配給C#中的引用類型?

class Program 
    { 
     static void Main(string[] args) 
     { 
      testclass objtestclass1 = new testclass(); 
      testclass objtestclass2 = new testclass(); 
      testclass objtestclass3 = new testclass(); 
      // Is seperate memory created for all the three objects that are created above ? 
      objtestclass1.setnumber(1); 
      objtestclass2.setnumber(2); 
      Console.Write(objtestclass1.number); 
      Console.Write(objtestclass2.number); 
      objtestclass3 = objtestclass1; 
      //When we assign one object to another object is the existing memory of  the   objtestclass3 be cleared by GC 
      Console.Write(objtestclass3.number); 
      objtestclass3.setnumber(3); 
      Console.Write(objtestclass3.number); 
      Console.Write(objtestclass1.number); 
      Console.Read(); 
      } 

      public class testclass 
      { 
       public int number = 0; 
       public void setnumber(int a) 
       { 
        number = a; 
       } 

      } 

謝謝。

回答

6

testclass的實例在堆上。每個實例將包括:

  • 同步塊
  • A型參考
  • number

在32位的Windows .NET,這將需要12個字節。

Main方法(objtestclass1等)內的局部變量會在堆棧上 - 但他們引用,而不是對象。每個引用將是4個字節(再次在32位CLR上)。

引用和對象之間的區別很重要。例如,該行之後:

objtestclass3 = objtestclass1; 

你讓兩個變量的值相同的 - 但這些值都爲引用。換句話說,兩個變量都是指相同的對象,所以如果您通過一個變量進行更改,則可以通過其他變量查看它。您可以將引用看作有點像URL--如果我們都有相同的URL,並且我們中的一個編輯了它引用的頁面,我們都會看到該編輯。

欲瞭解更多信息,請參閱my article on reference types和另一個在memory

+1

嗨,喬恩,謝謝你的回答。我很自豪地說,我是你的粉絲:) – Jebli 2009-11-18 17:23:49

2

是否爲上面創建的所有 三個對象創建了單獨的內存?

是的。

當我們分配一個對象到另一個 對象是
的objtestclass3現有的內存由GC

不完全清除 。首先,你並不是真的將一個對象分配給另一個對象。您正在重新分配一個變量,該變量包含對堆中內存的引用。其次,一旦堆中的內存不再有任何引用它的變量,GC就會檢測到這個事實並回收內存,但它永遠不會被「清除」。

+0

objtestclass3 = objtestclass1; 在這種情況下,objtestclass3指向objtestclass1引用的相同「位置」。對變量的任何更改都會反映objtestclass3和objtestclass1對象。 – PRR 2009-11-18 11:49:17

+0

是的。變量保存對內存的引用,而不是對象本身。 – RickNZ 2009-11-18 12:49:21

+0

是的,+1爲您的明確答案。 – PRR 2009-11-18 13:52:07

相關問題