- C#托管堆压缩:为了减少寻址时间,压缩。回收后,内存成为连续空间。
- Gen0, Gen1, Gen2 越晚申请的越容易被回收:因为Gen0满了就删除,剩下的压缩后成为Gen1。同样Gen1满了,回收后压缩成为Gen2. 下次清理内存的时候,还是从Gen0回收。
- C#基础类型的都是值类型,尤其是struct也是值类型。所有的值类型都集成自 System.ValueType 上,除非加声明?否则不可为null,保存在堆栈(Stack,先进后出)上,常见的值类型有:整形、浮点型、bool、枚举等。
- 拆箱和装箱:引用类型和值类型的相互转换叫做拆装箱操作。
- C#析构函数:GC回收的时候,看对象有没有析构函数,如果没有,直接释放; 如果有,把它放到另外一个队列,由另外这个队列执行完析构函数后,再释放该对象。
IDispose模式如下:
public class SampleClass : IDisposable
{
//演示创建一个非托管资源
private IntPtr nativeResource = Marshal.AllocHGlobal(100);
//演示创建一个托管资源
private AnotherResource managedResource = new AnotherResource();
private bool disposed = false;
/// <summary>
/// 实现IDisposable中的Dispose方法
/// </summary>
public void Dispose()
{
Dispose(true); //必须为true!!
//通知垃圾回收机制不再调用终结器(析构器)
GC.SuppressFinalize(this);
}
/// <summary>
/// 不是必要的,提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范
/// </summary>
public void Close()
{
Dispose();
}
/// <summary>
/// 必须,以备程序员忘记了显式调用Dispose方法
/// </summary>
~SampleClass()
{
Dispose(false); //必须为false!!
}
/// <summary>
/// 非密封类修饰用protected virtual
/// 密封类修饰用private
/// </summary>
/// <param name="disposing"></param>
protected virtual void Dispose(bool disposing)
{
if (disposed)
{
return;
}
if (disposing)
{
// 清理托管资源!!!
if (managedResource != null)
{
managedResource.Dispose();
managedResource = null;
}
}
// 清理非托管资源!!!
if (nativeResource != IntPtr.Zero)
{
Marshal.FreeHGlobal(nativeResource);
nativeResource = IntPtr.Zero;
}
//让类型知道自己已经被释放
disposed = true;
}
public void SamplePublicMethod()
{
if (disposed)
{
throw new ObjectDisposedException("SampleClass", "SampleClass is disposed");
}
//ignore
}