对象的创建和销毁笔记
对象的创建
对象是引用类型,创建在堆中,使用new关键字。只有在使用new关键字调用类的构造方法后才进行内存分配。当实例化类为一个对象时,对象中并不保存对象的值,而是保存在堆中创建的这个对象的地址。从这开始,一个对象的生存期就开始了。
对象的销毁
在C#中对象的销毁是由垃圾收集器(CLR)控制的,我们并不知道CLR什么时候销毁它,我们不能显式的销毁一个对象,不论他是有用的还是已经无用,这是因为垃圾收集算法的特殊设计,.NET 的垃圾收集器通过不定期地扫描应用程序正在使用的所有对象的列表来工作。扫描过程中所有未被发现的对象就可以被销毁并释放内存。当对对象的最后一个引用撤销后,算法的这种实现使运行库不能立即得到通知—它只能在下一次清理堆时发现。而且,这种算法尽可能少地进行垃圾收集,以便工作得最有效率。通常,堆容量的消耗(也就是内存大量消耗时)会触发收集过程。 但我们有一种方法,就是用Using关键字,C#中可使用using关键字自动清除对象资源使用using会自动调用MyObject的Dispose方法。如果MyObject未实现IDispose接口,则编译时会出错:无法将类型“MyProjects. MyObject”隐式转换为“System.IDisposable” 。
# MyObject.cs
namespace MyProjects
{
public class MyObject : IDisposable
{
public MyObject()
{
}
public void Dispose ( )
{
// Dispose
Console.WriteLine ( "Disposed" ) ;
//
}
}
}
# Class1.cs
namespace MyProjects
{
public class Class1
{
public Class1()
{
}
public static void Main ( string[] args )
{
using ( MyObject myObject = new MyObject ( ) )
{
Console.WriteLine ( "quit" ) ;
}
}
}
}
这种写法可替代
{
//
}
catch
{
}
finnaly
{
MyObject.Dispose ( ) ;
}
如果想手动的调用垃圾收集器
System.GC 类提供了一对方法。第一个是 Collect 方法—它强制垃圾收集器立即收集所有未被引用的对象。另一个是 RequestFinalizeOnShutdown (),它告诉垃圾收集器在应用程序关闭时一定要对每个对象运行 Finalize () 方法。在应用程序关闭时,垃圾收集器一般优先选择快速的退出方式而不是调用 Finzlize (),所以这个方法能手工强制运行库多负一点责任。
如下面的测试程序:
protected override void Finalize()
{
Console.WriteLine( "This is the Finalizer." );
}
}
class CApplication {
public static void Main()
{
Console.WriteLine( "This is Main." );
CTest test = new CTest();
// GC.RequestFinalizeOnShutdown();
}
}
运行此程序,然后再去掉 GC.RequestFinalizeOnShutdown() 这一行前面的注释标记并重新运行,会有不同。
还有方法GC.SuppressFinalize() 方法,可以手动调用垃圾收集器进行终结。