如何在C#中为引用类型分配内存?

时间:2009-11-18 10:06:46

标签: c# .net

您好我对引用类型的内存分配有疑问。请澄清我在下面的代码中注释的问题。

 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;
                }

            }

感谢。

2 个答案:

答案 0 :(得分:6)

testclass的实例在堆上。每个实例都包含:

  • 同步块
  • 类型参考
  • 字段number

在32位Windows .NET上,这将占用12个字节。

Main方法(objtestclass1等)中的本地变量将在堆栈中 - 但它们是引用,而不是对象。每个引用将是4个字节(同样在32位CLR上)。

引用和对象之间的区别很重要。例如,在此行之后:

objtestclass3 = objtestclass1;

您正在使两个变量的值相同 - 但这些值都是引用。换句话说,两个变量都指向同一个对象,因此如果您通过一个变量进行更改,您将能够通过另一个变量看到它。您可以将引用视为有点像URL - 如果我们都有相同的URL,并且我们中的一个人编辑它引用的页面,我们都会看到该编辑。

有关详细信息,请参阅my article on reference types上的memory和另一个{。}}。

答案 1 :(得分:2)

  

是否为所有人创建了单独的记忆   上面创建的三个对象?

  

当我们将一个对象分配给另一个对象时   对象是
的现有记忆   objtestclass3被清除   通过GC

不完全是。首先,您并没有真正将一个对象分配给另一个对象。您正在重新分配包含对堆上内存的引用的变量。其次,一旦堆上的内存不再有任何引用它的变量,GC就会检测到这个事实并回收内存,但它永远不会被“清除”。