close与dispose区别

当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别?

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

但是当我们写code时候,如果要实现Close和Dispose的时候,要注意Close和Dispose的设计模式。.net的一些class只提供Close,而且派生自IDisposable,并且隐藏了Dispose方法。是不是觉得很不明白了?

对这些class来说,关键在于它们显式的(explicitly)实现了IDisposable。对于隐式实现来说,你只需要调用"new A().Dispose()",但是对于显式实现来说,Dispose不会是这个class的成员函数。唯一的调用方式是你先要cast到 IDisposable才行。(“new A().Dispose()”编译不过,但是“((IDisposable)new A()).Dispose()”可以编译过)。所以这样就符合了设计的要求:提供Close(),隐藏Dispose(),并且实现了 IDisposable接口。

在.net的framework里,Close()被设计成public的,并且在Close()里面call被隐藏的Dispose(); Dispose()去call另一个virtual的Dispose(bool)函数。所以如果你从这个class继承,你就必须实现Dispose (bool)方法。

调用者call Close()的时候就会call到你重载的那个Dispose(bool)方法去释放资源。

时间: 2024-11-10 16:09:23

close与dispose区别的相关文章

用SqlParameter 给SQL传递参数

1.数据访问层 using的用法: 01.可以using System;导命名控空间 02.using 的语法结构 using(变量类型  变量名 =new 变量类型()) { } 案例: 03.using的原理 为什么出了using所在的{},会自动回收对象. 原因是当我们将要出{},系统自动调用了Dispose()方法. 而在DISpose方法中是这么实现的 2.哪些对象才可以使用Using回收!如:SqlConnection  Font 和File 也都可以使用using   因为他们实现

提高系统性能

使用using释放资源 (1)using用来释放一个对象占用的重要资源,不仅仅包括数据库对象,还有文件读写对象等: (2)使用using语法的对象都需要实现IDisable接口的Dispose()方法. 该方法专门用来释放对象占用的重要资源. (3)Dispose()方法封装了对Close()方法的调用. What is the resource ? 资源是实现 System.IDisposable 的类或结构,它包含名为 Dispose 的单个无参数方法 正在使用资源的代码可以调用 Dispo

C# using的一些事

一.using释放资源 using不可以释放所有的对象,原因如下: 1.using可以主动释放的对象都需要实现IDisable接口. 2.即使都实现了IDisable接口,也没有必要全部使用using,我们只对那些对系统性能有重要 影响的对象进行了using限定,而其他的对象可以交给垃圾回收器处理. using释放资源的过程: 首先回顾数据库连接和关闭代码的写法,说明数据库连接是一种宝贵的资源,用完了必须马上释放,使用try-catch-finally就可以保证数据库连接的正确释放.指出try-

1.使用using释放资源

using语句有二个关键字 >>作为关键字,using可以导入命名空间 >>作为C#语句,using可以释放对象占用的内存资源 语法: using(SqlConnection conn=new SqlConnection("data source=.;initial catalog=MySchool;uid=sa")) { //数据库操作代码........ } using语句允许用户定义一个范围,并在范围末尾释放对象! Using释放的是托管资源还是非托管资源

using关键字的使用

using语句的两个作用: 1)using可以导入命名空间 2)using可以释放对象占用的内存资源. 代码如下: using (SqlConnection con=new SqlConnection(constring)) { //数据库操作代码 } using语句允许用户定义一个范围,并在范围末尾处释放对象.在using语句中定义了一个数据库连接对象con,当程序执行到using语句末尾处时,CLR立即通过调用对象的Dispose()方法释放相应的对象. using释放的是托管资源还是非托管

使用using释放资源

using关键字 using 关键字可以用来导命名空间,与java中的import类似. 我使用using的地方 using(SqlConnection con=new SplConnection(connString)) { using(SqlCommand cmd=new SqlCommand(cmdTxt,con)) using的原理 为什么出了using所在的{},会自动回收对象. 原因是当我们将要出{},系统自动调用了Dispose()方法. 而在DISpose方法中是这么实现的 us

using关键字的用法

1.using 关键字可以用来导命名空间,与java中的import类似. 2.using关键字可以用来释放资源,并且被释放的资源代码是非托管代码. 既然可以释放非托管代码,那么什么是非托管代码? 我是这样理解的, 首先,必须满足IDisposable 条件() 什么是IDisposeable ? dispose 也有关闭,他之所以能够完成关闭的功能,原因是因为它里边有一个this.close()方法 微软是这么定义dispose的.... protected override void Dis

提高系统性能:从数据访问层开始

使用using释放资源 (1)using用来释放一个对象占用的重要资源,不仅仅包括数据库对象,还有文件读写对象等: (2)使用using语法的对象都需要实现IDisable接口的Dispose()方法. 该方法专门用来释放对象占用的重要资源. (3)Dispose()方法封装了对Close()方法的调用. What is the resource ? 资源是实现 System.IDisposable 的类或结构,它包含名为 Dispose 的单个无参数方法 正在使用资源的代码可以调用 Dispo

说一说垃圾回收的原理,讲一下过程?

垃圾回收:只回收托管堆中的内存资源,不回收其他资源(数据库连接.文件句柄.网络端口等) 什么样的对象才会被回收?答:没有变量引用的对象 什么时间回收? 系统回收,具体何时回收垃圾由系统自行确定,并不是即时执行回收的 手动调用垃圾回收器GC.Collect();,不建议使用,垃圾回收时会使程序暂停,影响程序性能 回收分为两个阶段: 标记 –> 压缩 基本工作原理就是遍历托管堆中的对象,标记哪些被使用对象(那些没人使用的就是所谓的垃圾), 然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所