asp.net 析构函数详解与用法

析构函数是实现销毁一个类的实例的方法成员。析构函数不能有参数,不能任何修饰符而且不能被调用。由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。

  虽然C#(更确切的说是CLR)提供了一种新的内存管理机制---自动内存管理机制(Automatic memory management),资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还是需要用到析构函数的,如在C#中非托管资源的释放。

  资源的释放一般是通过"垃圾回收器"自动完成的,但具体来说,仍有些需要注意的地方:

  1. 值类型和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自动释放所占内存,因为它们都保存在栈(Stack)中;

  2. 只有引用类型的引用所指向的对象实例才保存在堆(Heap)中,而堆因为是一个自由存储空间,所以它并没有像"栈"那样有生存期("栈"的元素弹出后就代表生存期结束,也就代表释放了内存),并且要注意的是,"垃圾回收器"只对这块区域起作用;

 

using System;
using System.Collections.Generic;
using System.Text;

namespace NET.MST.Third.FinalizeDispose
{
public class FinalizeDisposeBase : IDisposable
{
// 标记对象是否已被释放
private bool _disposed = false;

// Finalize方法:
~FinalizeDisposeBase()
{
Dispose(false);
}

// 这里实现了IDispose中的 Dispose方法
public void Dispose()
{
Dispose(true);

//告诉GC此对象的Finalize方法不再需要调用
GC.SuppressFinalize(true);
}

//在这里做实际的析构工作
//申明为虚方法以供子类在有必要时重写
protected virtual void Dispose(bool isDisposing)
{
// 当对象已经被析构时,不再执行
if (_disposed)
return;
if (isDisposing)
{
//在这里释放托管资源
//只在用户调用Dispose方法时执行
}
//在这里释放非托管资源

//标记对象已被释放
_disposed = true;
}
}

public sealed class FinalizeDispose : FinalizeDisposeBase
{
private bool _mydisposed = false;

protected override void Dispose(bool isDisposing)
{
// Don't dispose more than once.
if (_mydisposed)
return;
if (isDisposing)
{
//在这里释放托管的并且在这个类型中申明的资源
}
//在这里释放非托管的并且在这个类型中申明的资源

//调用父类的Dispose方法来释放父类中的资源
base.Dispose(isDisposing);

// 设置子类的标记
_mydisposed = true;
}

static void Main()
{
}
}
}

需要释放非托管资源时,就必须通过写代码的方式来解决。通常是使用析构函数释放非托管资源,将用户自己编写的释放非托管资源的代码段放在析构函数中即可。需要注意的是,如果一个类中没有使用到非托管资源,那么一定不要定义析构函数,这是因为对象执行了析构函数,那么"垃圾回收器"在释放托管资源之前要先调用析构函数,然后第二次才真正释放托管资源,这样一来,两次删除动作的花销比一次大多的。

时间: 2024-09-20 06:24:34

asp.net 析构函数详解与用法的相关文章

[ASP.NET] Session 详解

asp.net|session|详解 阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解.否则,阅读过程中会在相应的内容上遇到不同程度的问题. 懂得ASP/ASP.NET编程  了解ASP/ASP.NET的Session模型  了解ASP.NET Web应用程序模型  了解ASP.NET Web应用程序配置文件Web.config的作用.意义及使用方法  了解Internet Information Services(以下简称IIS)的基本使用方法  了解如何在Microsoft S

收藏:ASP的函数详解大汇总

函数|详解 ASP的函数详解 join(expression,"连接符") split :接收相关的参数,使之成为数组. Array() FUNCTION: 返回一个数组 SYNTAX: Array(list) ARGUMENTS: 字符,数字均可 EXAMPLE: RESULT: 建立了一个包含7个元素的数组myArray myArray("Sunday","Monday", ... ... "Saturday") CInt

ASP.NET OutputCache详解

  这篇文章主要介绍了ASP.NET OutputCache详解,本文详细讲解了OutputCache的语法.OutputCache的参数.OutputCache使用示例等内容,需要的朋友可以参考下 当用户访问页面时,整个页面将会被服务器保存在内存中,这样就对页面进行了缓存.当用户再次访问该页,页面不会再次执行数据操作,页面首先会检查服务器中是否存在缓存,如果缓存存在,则直接从缓存中获取页面信息,如果页面不存在,则创建缓存. 页面输出缓存适用于那些数据量较多,而不会进行过多的事件操作的页面,如果

ASP计数器设计详解-1

计数器|设计|详解 Active Server Pager(动态服务器主页,简称ASP),通过读写服务器的文件,结合script语言(VBscript或Jscript)和html码可以方便地实现页面计数器功能.现流行的ASP教材和网络上的ASP教程都谈到过ASP计数器的设计问题,但是都过于简单,比如没有提到怎样实现计数器脚本和主页面的分离以及图象计数器的实现等.下面就作者为单位制作NT web站点的经验,举实例循序渐进谈谈关于ASP计数器的设计,希望能给ASP的初学者和对ASP WEB编程有兴趣

ASP计数器设计详解-2

计数器|设计|详解 (三)与页面分离的图象计数器 人们的追求是永无止境的,也许你需要一个更有个性的图形数字计数器,而不是简单的文本数字计数器.没问题,现在我们就来看看用ASP是怎样来实现图形计数器功能的.要实现图形计数器,关键点在于如何实现把计数器文件中的数据值转变为对应的图象表示.因为十进制数有0,1,2,3,4,5,6,7,8,9共十个不同的数数字,我们需要有十个对应的图象,且图象的文件名字要与显示的数字对应起来,比如0对应的数字图象的文件名字就是0.gif,1对应的就是1.gif,...(

ASP的函数详解-1

函数|详解 Array() FUNCTION: 返回一个数组 SYNTAX: Array(list) ARGUMENTS: 字符,数字均可 EXAMPLE: <% Dim myArray() For i = 1 to 7 Redim Preserve myArray(i) myArray(i) = WeekdayName(i) Next %> RESULT: 建立了一个包含7个元素的数组myArray myArray("Sunday","Monday",

ASP的函数详解-2

函数|详解 LCase() FUNCTION: 返回字符串的小写形式 SYNTAX: Lcase(string) ARGUMENTS: string is any valid string expression. EXAMPLE: <% strTest = "This is a test!" response.write LCase(strTest) %> RESULT: this is a test! Left() FUNCTION: 返回字符串左边第length个字符以

ASP计数器设计详解(转载)

计数器|设计|详解 Active Server Pager(动态服务器主页,简称ASP),通过读写服务器的文件,结合script语言(VBscript或Jscript)和html码可以方便地实现页面计数器功能.现流行的ASP教材和网络上的ASP教程都谈到过ASP计数器的设计问题,但是都过于简单,比如没有提到怎样实现计数器脚本和主页面的分离以及图象计数器的实现等.下面就作者为单位制作NT web站点的经验,举实例循序渐进谈谈关于ASP计数器的设计,希望能给ASP的初学者和对ASP WEB编程有兴趣

ASP计数器设计详解

计数器|设计|详解 Active Server Pager(动态服务器主页,简称ASP),通过读写服务器的文件,结合script语言(VBscript或Jscript)和html码可以方便地实现页面计数器功能.现流行的ASP教材和网络上的ASP教程都谈到过ASP计数器的设计问题,但是都过于简单,比如没有提到怎样实现计数器脚本和主页面的分离以及图象计数器的实现等.下面就作者为单位制作NT web站点的经验,举实例循序渐进谈谈关于ASP计数器的设计,希望能给ASP的初学者和对ASP WEB编程有兴趣