2009-11-18 51 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

相关问题