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 ...
随机推荐
- Fuck me 忘记改REDO 造成复制用户超级慢
. 一个用户的测试环境, 想着复制用户进行功能和单点性能测试. 但是用户数据量较大,见图 2. 发现在测试环境里面复制一个用户 大概耗时2小时20min的时间, 测试虚拟机的配置: 最开始注意到awr ...
- css 按钮凹陷的感觉
.login-btn{ margin-top: 60rpx !important; background-color:transparent !important; width: 40%; margi ...
- centos 7 修改系统屏幕分辨率
centos 7 修改系统屏幕分辨率,命令方式和图形方式的修改方法. 命令:xrandr 通过命令 xrandr 修改系统的分辨率,输入xrandr: bash [admin@localhost ~] ...
- NAT模式下VMware中CentOS7无法连接外网的解决方法
故障现象 ----------------------------------------------------------------------------------------------- ...
- python列表和元组操作
列表 列表(list)是python以及其他语言中最常用到的数据结构之一.Python使用中括号[ ]来解析列表.列表是可变的(mutable)—可以改变列表的内容. 定义列表 names = ['m ...
- BZOJ3653谈笑风生——可持久化线段树+dfs序
题目描述 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ? 设a 和 b 为 T 中的两个不同节点.如果 a ...
- 洛谷 P3155 [CQOI2009]叶子的染色 解题报告
P3155 [CQOI2009]叶子的染色 题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到 ...
- Python文件和异常
程序和运行时数据是在内存中驻留的,涉及到数据交换的地方,通常是磁盘.网络等,因此需要IO接口. IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单 ...
- Android手势监听类GestureDetector的使用
在使用自定义视图的时候,对触屏事件的处理是比不可少的,有能力的可以自己写代码处理,这样更加的灵活.如果不想这么麻烦,Android提供了一个手势监听类GestureDetector,可以供我们使用.G ...
- 循环viewpager
如果viewpager listadapter小于三个.用这个移除异常. for (View view : viewList) { ViewGroup p = (ViewGro ...