C#析构函数与Dispose
有几种不同的操作方式
方式一:
namespace ConsoleApp1
{
class Test
{
~Test()// 析构函数
{
Console.WriteLine("~Test()析构函数");
}
} class Program
{
static void Main(string[] args)
{
Test f = new Test();
f = null;
GC.Collect();
Console.WriteLine("读取按键中");
Console.Read();
Console.WriteLine("读取到按键");
Console.WriteLine("程序结束"); }
}
}

方式二:
class Test
{
~Test()// 析构函数
{
Console.WriteLine("~Test()析构函数");
}
} class Program
{ static void Main(string[] args)
{
Test f = new Test();
//f = null;
GC.Collect();
Console.WriteLine("读取按键中");
Console.Read();
Console.WriteLine("读取到按键");
Console.WriteLine("程序结束"); }
}

方式三:
class Test:IDisposable
{
~Test()// 析构函数
{
Console.WriteLine("~Test()析构函数");
} public void Dispose()
{
Console.WriteLine("Dispose()");
GC.SuppressFinalize(this);
//throw new NotImplementedException();
}
} class Program
{
static void Main(string[] args)
{
using (Test f = new Test())
{
}
GC.Collect();
Console.WriteLine("读取按键中");
Console.Read();
Console.WriteLine("读取到按键");
Console.WriteLine("程序结束"); }
}

方式四:
class Test:IDisposable
{
~Test()// 析构函数
{
Console.WriteLine("~Test()析构函数");
} public void Dispose()
{
Console.WriteLine("Dispose()");//throw new NotImplementedException();
}
} class Program
{ static void Main(string[] args)
{
using (Test f = new Test())
{ }
GC.Collect();
Console.WriteLine("读取按键中");
Console.Read();
Console.WriteLine("读取到按键");
Console.WriteLine("程序结束"); }
}

其它:直接按控制台关闭按钮,是不会调用析构函数的。
注:SuppressFinalize是取消执行终结器(析构函数)的意思。
C#析构函数与Dispose的更多相关文章
- 析构函数和Dispose的使用区别
老生常谈的问题了,MSDN也有非常详细的说明但看起来不是很系统.也曾经做过分析,但没有总结下来又忘了,这次整理一下MSDN和网上搜集的一些资料,以备不时只需. 下面是MSDN对这两个函数的建议使用方法 ...
- 析构函数和Dispose方法的区别
1. 析构函数(Finalize)只能释放非托管资源, 它是由GC调用. 2. Dispose方法可以释放托管资源和非托管资源,它是由用户手动调用的. 在Dispose()中调用 GC.Suppres ...
- .net 的析构函数和dispose模式
- 内存回收,Dispose,Close,Finalie(C#中的析构函数)
NET中的资源分托管和非托管,所谓的托管是指CLR(通用语言运行时)中进行管理的资源,它可以由CLR自动进行内存回收. 也就是大家熟知的GC(垃圾回收机制). 而对于 非托管资源,比如数据库连接,CO ...
- C#中Dispose、析构函数、close的区别
一.Close与Dispose这两种方法的区别 调用完了对象的Close方法后,此对象有可能被重新进行使用:而Dispose方法来说,此对象所占有的资源需要被标记为无用了,也就是此对象要被销毁,不能再 ...
- C#中Dispose,finalize,GC,析构函数区别
释放类所使用的未托管资源的两种方式: 1.利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销. 2.IDisposable接 ...
- SafeHandle和Dispose z
SafeHandle最大的意义是封装一个托管资源且本身会执行.NET中的资源释放模式(所谓的Dispose Pattern),这样,开发者在使用非托管资源时,不可以不需要执行繁琐的资源释放模式,而直接 ...
- C# Dispose模式详细分析
C#Dispose模式 目的: 为了及时释放宝贵的非托管资源和托管资源,并且保证资源在被gc回收的时候可以正确释放资源,同时兼顾执行效率 必须遵循的事实: 1 托管资源释放: 由另一线程的gc进行释放 ...
- Dispose in c#
在标准的Dispose模式中,真正的IDisposable接口的Dispose方法并没有做实际的清理工作,它其实是调用了下面的这个带bool参数且受保护的的虚方法: protected virtual ...
随机推荐
- dotnet core 安装
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e "[packa ...
- centos目录
cd /opt cd /home/lujie cd /etc cd /usr cd /dev cd /bin cd /mnt cd /media cd /tmp
- Lodop打印设计界面生成代码带”...(省略)”
Lodop的设计界面中,菜单里的生成代码,如果打印项内容过多,后面会显示”...(省略)”,省略的是打印项的内容值,无论是纯文本还是超文本,都可以用选中打印项-右键-设置属性里找到该打印项的全部值,可 ...
- Link-Cut Tree(LCT)&TopTree讲解
前言: Link-Cut Tree简称LCT是解决动态树问题的一种数据结构,可以说是我见过功能最强大的一种树上数据结构了.在此与大家分享一下LCT的学习笔记.提示:前置知识点需要树链剖分和splay. ...
- HDU-3746-KMP理解失配
这个有点意思,要理解失配数组 题意是要计算出需要构造成循环节相连的最小个数 利用失配构造函数求出单个循环节,然后计算出需要的加上的珠子个数 #include <cstdio> #inclu ...
- MT【6】等比数列和的极限
评:利用等比数列求和公式给出所求数列,再利用反证法证明唯一性.这种反证方法印象中本科高等代数里讲初等对称多项式时出现过.
- hihocoder部分题解
hihocoder1609 数组分拆II [dp] 给定数组,问有多少种拆法,使得每一段不出现重复的数字,且要保证分组数最少.(1e5) 题解: O(n) d[i]表示1~i最小划分的段数, f[i] ...
- [hgoi#2019/2/16t1]math
题目描述 解法 我们稍微枚举一下前面几位,可以得到这样的规律. \[X_i=\frac{1}{2^{i+1}-1}\] \[Y_i=\frac{1}{2^{2^i}-1}\] 那么要使\(xm=yn\ ...
- 【转】typedef和#define的用法与区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
- CF401D Roman and Numbers
题意: 将n(n<=10^18)的各位数字重新排列(不允许有前导零) 求 可以构造几个mod m等于0的数字 分析: 状态压缩 状态: 设f[s][k]表示对于选择数字组合的s来说,%m等于k的 ...