繁体   English   中英

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

[英]How memory is allocated to reference types in 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;
                }

            }

谢谢。

testclass的实例在堆上。 每个实例将包括:

  • 同步块
  • 类型参考
  • 栏位number

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

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

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

objtestclass3 = objtestclass1;

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

有关此的更多信息,请参阅我关于引用类型的文章和关于内存的文章

是否为上面创建的所有三个对象创建了单独的内存?

是。

当我们将一个对象分配给另一个对象时,它就是
GC将清除objtestclass3

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM