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 ...
随机推荐
- oracle 18c centos7 设置开机自动启动Oracle
学习自: http://blog.csdn.net/condywl/article/details/57129696 1. 在root用户下进行修改 配置文件 /etc/oratab vim /etc ...
- Windows系统下PHP使用Redis
参考链接:https://www.cnblogs.com/lhat/p/6402472.html 环境:windows 10 64位操作系统 php 5.4 redis 3.0 1.redis ...
- hdu 4685(强连通分量+二分图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:n个王子和m个公主,王子只能和他喜欢的公主结婚,公主可以和所有的王子结婚,输出所有王子可能 ...
- xhtml的3種文檔聲明類型
xhtml有三種文檔聲明類型: strict:使用嚴格的標記,避免語法上的混亂: trasitional:為不支持的css的瀏覽器編寫xhtml時: frameset:利用框架將窗口分割為兩個部分或多 ...
- Codeforces965E Short Code 【启发式合并】【堆】
题目大意: 给出总长度不超过1E+5的不重复字符串集,给每个字符串选一个前缀使得可以区分它. 题目分析: KAN出的DIV2难度一般不高,想升Ranting的可以试试. 简单的树上启发式合并,建出Tr ...
- Maven中使用本地JAR包
在Maven项目中使用本地JAR包有两种方法: 1. 使用system scope <dependencies> <dependency> <groupId>org ...
- hihocoder部分题解
hihocoder1609 数组分拆II [dp] 给定数组,问有多少种拆法,使得每一段不出现重复的数字,且要保证分组数最少.(1e5) 题解: O(n) d[i]表示1~i最小划分的段数, f[i] ...
- luogu2774 [网络流24题]方格取数问题 (最小割)
常见套路:棋盘黑白染色,就变成了一张二分图 然后如果选了黑点,四周的白点就不能选了,也是最小割的套路.先把所有价值加起来,再减掉一个最少的不能选的价值,也就是割掉表示不选 建边(S,黑点i,v[i]) ...
- luogu2680 [NOIp2015]运输计划 (tarjanLca+二分答案+树上差分)
我们先不会就二分一下答案,设它是x,我们要判断它能不能满足 为了满足这个答案,我们就要让原本路径长度大于x的所有路径都经过某条边,而且这条边还要大于等于最长的路径-x 于是运用树上差分的思想,对于所有 ...
- Azure Powershell script检测登陆并部署ARM Template
本文简单提供了一个Azure powershell脚本,能实现如下功能 Azure (China)账户是否已经登陆了,如果没登陆,会提示你登陆. 要创建的资源组是否存在,存在的话不再创建,直接部署te ...