C#内存管理与性能优化

托管、非托管

       为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码叫"非托管代码". 事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。

       非托管代码,如包装操作系统资源的一类对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器(GC)可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。


内存分配

       值数据类型存储在栈(Stack)中,指针变量和函数传递的参数也都是值数据类型,存储在栈中;引用类数据对象存储在堆(Heap)中。

       栈中的数据释放遵循后进先出的准则,即后申明的变量先结束作用域,变量的生存期必须嵌套。

       引用类数据存储在堆中,而引用变量还是存储在栈中,并且栈中可以有多个变量引用堆中的引用数据。当栈中的某个引用变量超出作用域时,引用数据并不一定会释放,只有当栈中对其引用的变量全部超出作用域,并等待垃圾回收器删除它或程序终止时,引用数据才能被释放。


Dispose

[参考]http://msdn.microsoft.com/zh-cn/library/fs2xkftw(v=vs.110).aspx

这是实现 Dispose 模式的常规模式重写 Object.Finalize的基类:

using System;

class BaseClass : IDisposable
{
	// Flag: Has Dispose already been called?
	bool disposed = false;
	
	// Public implementation of Dispose pattern callable by consumers.
	public void Dispose()
	{ 
		Dispose(true);
		GC.SuppressFinalize(this);           
	}
	
	// Protected implementation of Dispose pattern.
	protected virtual void Dispose(bool disposing)
	{
		if (disposed)
			return; 
		
		if (disposing) {
			// Free any other managed objects here.
			//
		}
		
		// Free any unmanaged objects here.
		//
		disposed = true;
	}
	
	~BaseClass()
	{
		Dispose(false);
	}
}
这是实现 Dispose 模式的常规模式重写 Object.Finalize的派生类:
using System;

class DerivedClass : BaseClass
{
	// Flag: Has Dispose already been called?
	bool disposed = false;
	
	// Protected implementation of Dispose pattern.
	protected override void Dispose(bool disposing)
	{
		if (disposed)
			return; 
		
		if (disposing) {
			// Free any other managed objects here.
			//
		}
		
		// Free any unmanaged objects here.
		//
		disposed = true;
	}
	
	~DerivedClass()
	{
		Dispose(false);
	}
}
这是配置模式实现的常规模式使用安全句柄的基类:
using System;

class BaseClass : IDisposable
{
   // Flag: Has Dispose already been called?
   bool disposed = false;

   // Public implementation of Dispose pattern callable by consumers.
   public void Dispose()
   { 
      Dispose(true);
      GC.SuppressFinalize(this);           
   }

   // Protected implementation of Dispose pattern.
   protected virtual void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         // Free any other managed objects here.
         //
      }

      // Free any unmanaged objects here.
      //
      disposed = true;
   }
}

这是实现 Dispose 模式的常规模式使用安全句柄的派生的类:

using System;

class DerivedClass : BaseClass
{
   // Flag: Has Dispose already been called?
   bool disposed = false;

   // Protected implementation of Dispose pattern.
   protected override void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         // Free any other managed objects here.
         //
      }

      // Free any unmanaged objects here.
      //
      disposed = true;
   }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值