C#-Dispose 和 Close 的区别

C#中Dispose和Close的区别 首先,Dispose和Close基本上应该是一样的。Close是为了那些不熟悉Dispose的开发者设计的。因为基本上所有的developer都知道Close是干吗的(特别是对于那些有C++背景的developer)。 立即下载

Dispose 和 Close 的区别

Dispose和Close基本上是一样的,Close是给不熟悉Dispose的开发者设计的;对于某些类来说,Close更有逻辑性.
.NET的一些class只提供Close,且派生自IDisposable并隐藏了Dispose方法; 这些class,它们其实显式的实现了IDisposable.
Close被设计成public的,并且在Close里面显式实现了接口IDisposable中的Dispose方法; 而这个方法里面,又调用了方法Dispose(bool)(此为虚函数,使用protected修饰符),所以你从这些类(只提供Colse的类)中继承的话就必须实现Dispose(bool)这个方法;所以如果你要实现一个有Close的类的话,也需实现Dispose(bool);
        提示:编译器在编译析构函数时,会隐式的把析构函数编译为Finalize()方法的对应代码,确保执行父类的Finalize()方法.
例1
//例1
abstract class SysClass : IDisposable
{
    
private IntPtr m_unmanagedResource;
    
private Bitmap m_bitmap;
    
private bool m_disposed = false;

    
public SysClass()
    
{
        m_unmanagedResource 
= Marshal.AllocCoTaskMem(100);
        m_bitmap 
= new Bitmap(50,50);
    }


    
void IDisposable.Dispose() //显式实现
    {
        Dispose(
true); //调用 Dispose(bool)
           //不要再去浪费资源的去执行析构函数了,上面已经执行过啦
        GC.SuppressFinalize(this);
    }


    
//实现Dispose(bool),注意,此为虚函数,使用protected修饰符
       //protected的好处是不让用户有可能主动去调用 Dispose(false)
    protected virtual void Dispose(bool isDisposing) 
    
{
        
if(!m_disposed)
        
{
            
if(isDisposing)
            
{
                
//在此处释放托管资源
                m_bitmap.Dispose(); //m_bitmap就是托管资源
            }

            
//在此处释放非托管资源
            Marshal.FreeCoTaskMem(m_unmanagedResource);
            m_disposed 
= true;
        }

    }


    
public void Close()
    
{
        ((IDisposable)
this).Dispose();
    }


    
~SysClass()
    
{
        Dispose(
false);
    }

}


class MyClass : SysClass //实现一个自己类里的Close
{
    
private IntPtr m_anotherMemory;
    
private Bitmap m_anotherImage;
    
private bool m_disposed = false;

    
public MyClass()
    
{
        m_anotherMemory 
= Marshal.AllocCoTaskMem(20);
        m_anotherImage 
= new Bitmap(25,25);
    }


    
//实现Dispose(bool)
    
//如果传入false,就只释放非托管资源;传入true,全部释放
    protected override void Dispose(bool isDisposing)
    
{
        
if(!m_disposed)
        
{
            
if(isDisposing)
            
{
                
//在此处释放托管资源
                m_anotherImage.Dispose();//m_anotherImage就是托管资源
            }

            
//在此处释放非托管资源
            Marshal.FreeCoTaskMem(m_anotherMemory);
            
base.Dispose(isDisposing);//子类会执行父类的构造函数,这里还需释放父类的
            m_disposed = true;
        }

    }

    
    
~MyClass()
    
{
        Dispose(
false);
    }

}


public static void Main(string[] args)
{
    SysClass sc 
= new MyClass();
    sc.Close(); 
//正确
    sc.Dispose(); //错误
    ((IDisposable)sc).Dispose(); //正确
}
MyClass类和它的父类都使用了双保险(Dispose+析构函数)来释放资源.如果用户调用了Dispose(),就不会再调用析构函数(SuppressFinalize的缘故);但如果用户忘记调用Dispose(),就自然会转到析构函数而析构函数本来就具有释放托管资源的能力,所以只要将false传给Dispose就行了.
 
2007-09-08添加
要实现一个具有Dispose功能的类,首先该类要继承自一个具有Close()方法的类,并实现一个Dispose(bool),此函数是一个Protected型的重载函数.
实现过程:
1) Close()里面其实调用了IDisposable接口的Dispose()方法;
2) Dispose方法(此方法需显式实现)里调用了Dispose(bool)方法
3) Dispose(bool)方法里实现了托管和非托管资源的释放.
4) (可选)最好在类的析构函数里实现Dispose(false)方法(flase标记的作用是只释放非托管资源)
5) (可选)子类的释放自身资源的同时也要释放父类中的资源(如果父类在构造函数中生成了资源).我觉得,就算父类的构造函数中没有生成资源,也最好在子类中实现一下.(见上例 base.Dispose(isDisposing);)
6) 注意使用类的对象调用Dispose()方法时的写法.(见上例)
探讨C#中Dispose方法与Close方法的区别详解 群里有人问,怎样直接清空堆里的string值。有人建议直接用Dispose()方法;Dispose()销毁了对象,是一种垃圾回收机制。(这里用using或许更好)当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 在这里,要明确一下C#程序(或者说.NET)中的资源。简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象;非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、 立即下载

相关推荐

移远EC20模块USB模式切换的底层逻辑与驱动适配探秘

本文深入探讨了移远EC20模块USB模式切换的底层逻辑与驱动适配机制,详细解析了AT命令控制下的USB0与WWAN0模式差异。通过分析USB协议栈、内核驱动框架及网络子系统的交互,提供了模式切换的完整操作流程和常见问题解决方案,助力开发者优化4G通信模块在嵌入式设备中的稳定连接。

cc789的博客 843

dispose与close()的区别

Dispose了,就必须再Create一次而Close()后,还可以再Open(), 而Dispose后,对象都不存在了,就不能Open()了Dispose是对于对象自身而言的,Close是对于连接数据库而言的其它都是误导...  以下是相关知识点:1.SqlConnection conn = new SqlConnection(strConnection)时,如果原来的连接已经关闭,

cxzhq2002的杂记 2585

Cadence——原理图相关教程

包含创建文件,原理图,元器件,规则检查,PDF与BOM清单输出,各类PCB网表

haonanyayaya的博客 1万+

C#中Dispose方法和Close方法的区别!

群里有人问,怎样直接清空堆里的string值。有人建议直接用Dispose()方法;Dispose()销毁了对象,是一种垃圾回收机制。(这里用using或许更好) 当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 【 在这里,要明确一下C#程序(或者说.NET

jintougao的专栏 7709

大疆 DJI Mobile SDK实战指南——从零构建Android示例开发环境

本文提供了一份详尽的DJI Mobile SDK Android开发环境搭建实战指南。文章手把手教你从注册开发者账号、获取App Key,到配置Android Studio、下载官方示例代码,最终成功运行DJI官方Android示例程序,帮助开发者快速入门无人机应用开发,避开常见编译与依赖问题。

weixin_29188043的博客 273

第二天 原来Labview语言结构也挺自然(2.1 顺序结构)

新建项目文件StructureTest.lvproj,新建四个子VI(FlatSequence.vi、CaseStructure.vi、LoopStructure.vi、EventStructure.vi),具体新建流程可以参考1.2节。

weixin_38637405的博客 1003

c#中窗体的close、dispose的区别及分析

一个小程序,初始运行正常,当实际使用时,突然发现程序运行一段时间后,会自动的弹出一个系统中的messagebox。我想当然的认为是病毒在作怪吗?把程序安装到其他电脑上,故障依然,可以肯定是代码的事了。 仔细观察代码、故障现象后,发现是窗体在close后,窗体中的timer控件依然工作,我在timer控件到达指定的时间(10分钟)后,就会弹出故障中出现的messagebox。 处理:如果想关闭showdialog出的窗体,应使用dispose方法,然后将窗体变量赋值null。即使不对窗体变量赋值null,

u011555996的博客 2677

Python爬虫实战:基于最新技术爬取国家企业信用信息公示系统数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的国家企业信用信息公示系统爬虫。我们将从爬虫基础知识讲起,逐步深入到反爬机制应对、数据解析与存储等高级话题,最终实现一个完整的爬虫系统。文章包含大量实战代码示例,适合中高级Python开发者学习参考。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和商业情报收集等领域。通用爬虫:如搜索引擎爬虫,广泛抓取互联网公开信息聚焦爬虫:针对特定领域或网站的数据采集增量式爬虫:只抓取更新内容,减少资源消耗。

2201_76125261的博客 2406

C#中Dispose和Close的区别!

当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别?首先,Dispose和Close基本上应该是一样的。Close是为了那些不熟悉Dispose的开发者设计的。因为基本上所有的developer都知道Close是干吗的(特别是对于那些有C++背景的developer)。但是当我们写code

johncools的博客 1776

在 SAP BTP 上为应用开启多租户能力:基于 SaaS Provisioning 和 XSUAA 的完整实践指南

本文介绍了在SAP BTP上配置多租户应用的实战指南。主要内容包括: 多租户架构概述:解释provider子账户、consumer子账户和tenant的概念,以及数据隔离机制。 安全配置:在xs-security.json中设置tenant-mode为shared,并为SaaS Provisioning服务添加回调scope授权。 路由配置:通过manifest.yml设置TENANT_HOST_PATTERN来定义多租户访问模式,确保不同租户通过不同子域名访问同一应用。 服务绑定:将XSUAA和SaaS

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 144

【AIGC】大模型面试高频考点09-大模型Agent框架

聚焦AIGC专业技术分享

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1966

C#中Dispose、析构函数、close的区别

在开始本文前,需要一些准备知识。首先要提出“什么是资源”。在CLR出来之后,Windows系统资源开始分为“非托管资源”和“托管资源”。 非托管资源是指:所有的Window内核对象(句柄)都是非托管资源,如对于Stream,数据库连接,GDI+的相关对象,还有Com对象等等,这些资源并不是受到CLR管理; 托管资源是指:由CLR管理分配和释放的资源...

aikb6223的博客 748

Unreal5从入门到精通之如何在VR中使用3DUI

前面我们讲过《Unreal5从入门到精通之UMG的使用》一般制作游戏时,UI都是添加到屏幕视窗上面的,但是在制作VR时,我们往往需要制作一个3D的UI,放置在场景中,然后使用手柄的射线来和UI进行交互。今天我们就来讲解下,如何在VR中创作和交互3DUI首次操作会感觉好复杂,多多练习,当你熟悉了UE蓝图的操作后会发现,这只是一个常规的蓝图操作而已。祝大家在虚幻的学习过程中非常顺利。希望这篇博客对你有所帮助。

TxNet 1984

C#中close和dispose区别

Close是停业整顿 Dispose是炸毁 通俗明了-----by metababy 停业了,可以通过公关,再重开。物还是原来的物 炸毁了,想再开张,就只有重头建起 C#中析构函数是有垃圾搜集器来调用的,当所引用的堆上的数据当无效时,会隐式调用。一般表现为当引用变量超出其作用域时就会调用。 Close函数和Dispose函数则是一种约定。调用Close函数释放资

程序人生,学海无涯 2471

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# Form Dispose 和 Close的区别

看来这个之后很有启发。但是一般关闭还是用close比dispose要好。 讨论的链接:https://bbs.csdn.net/topics/50424243 原文链接:https://blog.csdn.net/cnhk1225/article/details/22873157 想做个简单的单件设计模式(Singleton)的小例子,结果出现了一些意想不到的问题。我的本意是建立两个窗...

qq_36583051的博客 1271

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C#中 Flush Dispose和Close的区别!

【个人学习过程记录,不一定准确】 想知道,C#中的文件缓冲的 流是什么意思?Flush() 执行的时候,究竟做了什么,流程是什么啊 缓冲区干嘛的 你写了一个程序,其中要对硬盘上的一个文件操作,FileStream fs = new FileStream(fileName)这样就是建立了一个文件缓冲流,换句话的意思就是说你通过这条程序,计算机给了一一块内存空间,但是呢这块内存空间不是

一个Revit二次开发的实习生 4115

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# 中Dispose、析构函数、close的区别

  链接:http://www.studyofnet.com/news/293.html 本文导读:C#中析构函数 和 Dispose 都是释放资源,析构函数用于 隐式释放资源,Dispose用于 显式释放资源,也就是析构函数 是对象不可访问后自动被调用的,Dispose 是类使用者调用的;close方法表示关闭资源,并不一定代表会释放资源。 析构函数不能显示调用,而对于Dispose、cl...

皮皮君的博客 1526

[转]C#中Dispose和Close的区别!

原文地址: http://www.cnblogs.com/kevinwan/archive/2007/01/16/621869.html当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别?首先,Dispose和Close基本上应该是一样的。Close是为了那些不熟悉Dispose的开发者设

菩提树下的杨过 731
上一篇: C++-必知必会_常量成员函数的含义(条款10)
下一篇: C#-new 和 override 的区别
MasterFT
博客等级 码龄20年 48粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值