C#内存管理与性能优化

发表于:2014-6-03 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:qq168213001    来源:51Testing软件测试网采编

  托管、非托管
  为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码叫"非托管代码". 事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。
  非托管代码,如包装操作系统资源的一类对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器(GC)可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。
  内存分配
  值数据类型存储在栈(Stack)中,指针变量和函数传递的参数也都是值数据类型,存储在栈中;引用类数据对象存储在堆(Heap)中。
  栈中的数据释放遵循后进先出的准则,即后申明的变量先结束作用域,变量的生存期必须嵌套。
  引用类数据存储在堆中,而引用变量还是存储在栈中,并且栈中可以有多个变量引用堆中的引用数据。当栈中的某个引用变量超出作用域时,引用数据并不一定会释放,只有当栈中对其引用的变量全部超出作用域,并等待垃圾回收器删除它或程序终止时,引用数据才能被释放。
  Dispose
  这是实现 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);
}
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号