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

如何将内存分配给C#中的引用类型?,c#,.net,C#,.net,您好,我对引用类型的内存分配有一些疑问。请澄清我在下面代码之间注释的问题 class Program { static void Main(string[] args) { testclass objtestclass1 = new testclass(); testclass objtestclass2 = new testclass(); testclass objtestcla

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

 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
的实例。每个实例将包括:

  • 同步块
  • 类型引用
  • 字段
    编号
在32位Windows.NET上,这将需要12个字节

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

引用和对象之间的差异很重要。例如,在这一行之后:

objtestclass3 = objtestclass1;
您正在使两个变量的值相同-但这些值都是引用。换句话说,两个变量都引用同一个对象,因此如果您通过一个变量进行更改,您将能够通过另一个变量看到它。你可以把引用想象成一个URL——如果我们都有相同的URL,并且我们中的一个编辑了它引用的页面,我们都会看到这个编辑


有关这方面的更多信息,请参阅和上的另一个。

堆中有
testclass
的实例。每个实例将包括:

  • 同步块
  • 类型引用
  • 字段
    编号
在32位Windows.NET上,这将需要12个字节

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

引用和对象之间的差异很重要。例如,在这一行之后:

objtestclass3 = objtestclass1;
您正在使两个变量的值相同-但这些值都是引用。换句话说,两个变量都引用同一个对象,因此如果您通过一个变量进行更改,您将能够通过另一个变量看到它。你可以把引用想象成一个URL——如果我们都有相同的URL,并且我们中的一个编辑了它引用的页面,我们都会看到这个编辑

有关这方面的详细信息,请参阅和上的另一个

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

当我们将一个对象指定给另一个对象时 对象是
无法清除objtestclass3 通过GC

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

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

当我们将一个对象指定给另一个对象时 对象是
无法清除objtestclass3 通过GC


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

objtestclass3=objtestclass1;在本例中,objtestclass3指向objtestclass1引用的同一“位置”。变量的任何更改都将反映在objtestclass3和objtestclass1对象中。是。变量包含对内存的引用,而不是对象本身;在本例中,objtestclass3指向objtestclass1引用的同一“位置”。变量的任何更改都将反映在objtestclass3和objtestclass1对象中。是。变量引用的是内存,而不是对象本身。嗨,乔恩,谢谢你的回答。我很自豪地说我是你的粉丝:)嗨,乔恩,谢谢你的回答。我很自豪地说我是你的粉丝:)