【IT168 技术文档】C#使用的自动内存管理,使用开发者从繁重的手工分配、释放内存的操作解放出来。内存的自动管理是由垃圾回收器来执行。一个对象使用内存的生命周期是这样的:当对象被创建时,它便分配了一定的内存,当构造器中的代码开始运行时,这个对象就“活”了。
当这个对象或者是它的任何一部分在可以预计的将来已经没有任何作用时,这个对象将不会再使用,它就应当被销毁。
一旦这个对象符合了对销毁的条件,在一定的时间后,这个对象的销毁器就将被执行,一般情况下,除非被显示地重写,这个销毁器只能运行一次。
一旦销毁器被运行,那么这个对象以及它任何一部分都不可能在以后的运行中使用,这甚至包括正在运行的销毁器。这时这个对象将被认为是不可见的,它所占的资源将会被回收。
最后由垃圾回收器释放这个对象所占的资源。
垃圾回收器控制着这些对象的使用信息并利用这些信息控制内存,比如内存哪里创建了一个新对象,什么时候重新创建对象以及什么时候将这个对象释放。
像其它的语言一样,C#假定确实存在这样一个垃圾回收器,而且这个垃圾回收器可以管理很大范围的内存。比如,C#并不要求销毁器一事实上要执行,也不要求对象一旦无用则马上回收。
当然垃圾回收器的行为也是可以被控制的,这个控制的方法来自于System.GC类。这个类可以请求回收、销毁器运行等操作。
下面是一个例子。
class A
{
~A() {
Console.WriteLine("Destruct instance of A");
}
}
class B
{
object ref;
public B(object o) {
ref = o;
}
~B() {
Console.WriteLine("Destruct instance of B");
}
}
class TMest
{
static void Main() {
B b = new B(new A());
b = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
{
~A() {
Console.WriteLine("Destruct instance of A");
}
}
class B
{
object ref;
public B(object o) {
ref = o;
}
~B() {
Console.WriteLine("Destruct instance of B");
}
}
class TMest
{
static void Main() {
B b = new B(new A());
b = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}