[英]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.