c#代码垃圾回收:
托管对象:GC回收,
非托管对象:程序员自己释放
class Program
{
static void Main(string[] args)
{
//using (GCTest gc=new GCTest())
//{
// int a = 1;
//}
method();
GC.Collect();//强制GC回收垃圾,触发对象析构函数,对象终结器,即~GCTest()方法
Console.ReadKey();
}
static void method()
{
GCTest gc = new GCTest("a");
gc.Dispose();
GCTest gc2 = new GCTest("b");
gc2.Dispose();
}
}
class GCTest : IDisposable
{
private string Name { get; set; }
public GCTest(string name)
{
this.Name = name;
}
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
// TODO: 将大型字段设置为 null。
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
//~GCTest()
//{
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
//}
// 添加此代码以正确实现可处置模式。
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
GC.SuppressFinalize(this);//防止GC重复收集垃圾,执行此代码,GC就不执行~GCTest()了
}
#endregion
}