C#中Dispose和Close的区别
当我们开发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)方法去释放资源。
请参考 http://blogs.msdn.com/brada/archive/2003/07/06/50127.aspx
注意事项:
1,Close()不应该被定义成virtual。对于这个design pattern,Close()只是用来call那个隐藏的Dispose(),用户不应该改变Close的behavior。对于这个问题, System.IO.Stream也有设计问题。之所以有问题是为了满足向后兼容的需求。See http://msdn2.microsoft.com/en-us/library/ms227422.aspx. 文档里面提到虽然Close()是virtual的,但是不应该被override。
深入解析Close和Dispose的区别
反对, 否定, 加强语气的重要词首, 除去
作为否定意义
disable 使丧失能力 , He was disabled in the accident.
disabled 残疾的,丧失能力的
disadvantage 不利条件, advantages and disadvantages 利害得失
disagree 不同意, Let's agree to disagree.让我们各自保留自己的意见吧。(disagree + with)
disappear 从视线中消失,Gradually the heavy footsteps died away. 声音消失(die away)
disappoint 失望, His hopes have been repeatedly disappionted.他的希望一再落空。He was disappointed, but didn't despair.他失望,但未绝望。
disarm 解除武装,裁军
disaster (dis + aster),aster词根star,原义“星位不正,灾星”,灾难,彻底失败。
disastrous 灾难性的,很糟的。
discharge (dis否定 + charge 装载),卸货,排出,解雇。A chimney discharges smoke。烟囱冒烟。
disclose (dis否定 + close封闭)揭露,disclose the truth/secret 透露真相,泄露秘密。
discount (dis 不 + count 算——不算)打折,He bought the house at a 10% discount。他以九折的价钱买了这房子。
discourage (dis 失去 + courage 勇气),使失去勇气,使泄气,劝阻————反义encourage
discover (dis 否定 + cover 覆盖),发现。——掀起你的盖头来,让我看看你的脸。——千呼万唤始出来,犹抱琵琶半遮面。
disease (dis 不 + ease 舒服——easy)疾病,不健全。 My brother is often absent from work because of illness. He contracted a disease during the war and has recurrent attacks.我弟弟因患病而缺勤,他在战争中染上了一种病,并经常复发。
disinterested (dis 不 + interested 利益相关的,有私心的)公正无私的,与 uninterested(没兴趣的)相区别,the disinterested assistance 无私的援助,A judge should be disinterested in a case he is trying. 法官在审理案件上应该不偏不倚。
dislike 不喜欢, I don't think I've seen anything I dislike more. 我最不喜欢的莫过于此事。
dismount(dis 否定 + mount 山),下马,下车,取下,卸下。
disorder(dis=not + order 顺序),骚乱,失调,病。My stomach is out of order。我胃有毛病————a stomach disorder 胃病。
dispense (dis 不 + spense 花费),动词,节省,不必需——反义词expense 花费(名词)———indispensable(in 不 + dis 不 + spense 花费 + albe 可...的)——不可不花费的——必须的,必不可少的。Air, food and water are indispensable。
display (dis 否定 + play=ply 折叠)展开,陈列,I have a large display of samples to show you. 我有大批样品给你看。on display = on exhibition 在展览中
disregard(dis 不 + regard 看)——无视,不理会,忽视。
distrust 不信任。
作为离开、分离意义
discard (dis + card)原义“打扑克牌时将card扔出”。discard 抛弃具体事物,desert 通过离开的方式抛弃。
discern 辨别,——concern (con相关——concern 涉及、关心),在此 dis 做“分离”——discern 相别,看出。I discerned his figure in the dark。我在黑暗中辨别出他的身影。
discerning 辨识能力强的。
discrete (dis 分离apart + crete)分离的,不相关联的。——反义词 concrete具体的(成一体)。The picture consisited of a lot of discrete spots of color.这幅画由许多互不关联的色块组成。 I am interested in concrete objects instead of abstract notions.我感兴趣的是具体事物,而非抽象概念。
discriminate (dis分开 + crimin罪 + ate)分开,歧视。No one should be discriminated against。不应该其实任何人。
discrimination 辨别力,歧视,racial discrimination 种族歧视,racial sgregation 种族隔离。
dismiss (dis=away + miss=send),打发走(send away),解散,消除,I was frightened to death that I would be dismissed. 想到我可能被开除,我真吓得要死。
disperse (dis=apart + sperse=sparse),sparse 稀少的,disperse 疏散开,消散。The wind dispersed the smoke.风把烟吹散了。
dispirit (dis=off + spirit 精神),失去精神力量,使泄气, dispirit a person from future exertions,使一个人丧失为未来努力的勇气。
displace (dis 离开 + place 位置),取代,替代,离开家园。 I don't want to be displaced in your heart by that young fool. Many inhabitants were displaced by the floodwater.流离失所。“取代”,区别于replace,replace侧重以新代旧,常意味着原物已失去作用。
dispose (dis 分开 + pose 放置)——分开放置——排列,布置,倾向于,有利于,dispose pieces of furniture 布置家具,His prejudice disposed him to rule in their favor. 他的偏见使他倾向于做出有利于他们的裁决。去掉,dispose of furniture 处理家具,dispose of 处理,解决,I can dispose of your argument easily。我轻而易举地驳倒了你的论点。
disposal 名词,丢掉,布置。at sb's disposal 任某人处理,供某人使用。If I can be of service, I'm at your disposal.
disposition 意向,排列。
dispute (dis 分离 + pute 考虑),想法不一,各抒己见——争论。 dispute with sb. about/over sth.就某事与某人争论。
disrupt (dis=off + rupt=break)使中断,扰乱=bring or throw into disorder 。
A crowd of protesters disrupted the meeting. 一群抗议者打断了会议。
dissolve (dis=away + solve 溶解)——使融化,解散,消失。
All his hopes dissolved at the terrible news. 那个极坏的消息使他的一切希望破灭了。
distance (dis=apart + stance=stand 分立于两处),距离。世界上最遥远的距离,不是生与死,而是我就站在你面前,你却不知道我爱你;世界上最遥远的距离,不是我就站在你面前,而你不知道我爱你,而是明明知道彼此相爱,却不能在一起;世界上最遥远的距离,不是明明知道彼此相爱,却不能在一起,而是明明无法抵挡这股思念,却还故意装作丝毫未将你放在心里;世界上最遥远的距离,不是明明无法抵挡这股思念,却还故意装作丝毫未将你放在心里,而是用自己的冷漠的心对爱你的人,掘了一条无法跨越的鸿沟。
distant 远处的,疏远的,Her manner was rather distant. 她的态度相当冷淡。
distort (dis=off 离 + tort=turn,twist 扭),扭离原形——扭曲,歪曲,The reporter distorted the facts.
distract (dis = away,off + tract 引)——使分心——反义词 attract。 If something distracts you or your attention , it makes you stop concentrating on what you are doing.
distribute (dis 分开 + tribute 物品),分送,分配,distribute the apples to the children 分苹果给孩子们, These plants are widely distributed in China.这些植物在我国分布广泛。
distribution 分布。
其他意义
discuss 讨论, discussion
dish 盘,菜,dish out 给予,分发
disk 唱片,compact disk——CD,video compact disk(VCD)
disco——discotheque 迪斯科。
discipline 纪律
distinct (形容词)有区别的,清楚的,物的整体可被明白看见的叫做 clear, 物的各部非常clear 叫做distinct。————distinguish(动词)
distinction 不同,差别,区分,优秀。 make distinction between good and bad 区别善恶
distress (di 加强 + stress 压力)忧虑,危难 Company in distress makes trouble less 同病相怜。
district (di 加强 + strict 限制)——区,行政区
disturb 打扰
disturbance 扰乱
很多人都认为Close()方法内部会调用Dispose()方法,所以并没有本质的区别!实际上这个看法不是很准确,对有
些类来说,的确Close()和Dispose()没有本质区别,但是对有些类来说并非如此!
首先,让我们看看我们最常使用的SqlConnection的Close()方法和Dispose()方法的区别:
SqlConnection类的Dispose()方法是继承于Component类的,源代码是这样的:
public void Dispose() {
Dispose(true); //调用Dispose的一个带参数的重载
GC.SuppressFinalize(this); //请求系统不要调用指定对象的终结器。
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
lock(this) {
if (site != null && site.Container != null) {
site.Container.Remove(this);
}
if (events != null) {
EventHandler handler = (EventHandler)events[EventDisposed];
if (handler != null) handler(this, EventArgs.Empty);
}
}
}
}
SqlConnection类的Close()方法在MSDN中的说明是这样的:
关闭与数据库的连接。这是关闭任何打开连接的首选方法。 如果 SqlConnection 超出范围,则不会将其关闭。因
此,必须通过调用 Close 或 Dispose 显式关闭该连接。Close 和 Dispose 在功能上等效。如果连接池值
Pooling 设置为 true 或 yes,则基础连接将返回到连接池。另一方面,如果 Pooling 设置为 false 或 no,则
会关闭到服务器的基础连接。
看说明好象是Close()方法和Dispose()方法是类似的,实际上只是在关闭连接这个功能上等效,让我们看看Close
()方法的源代码:
override public void Close() {
IntPtr hscp;
Bid.ScopeEnter(out hscp, " %d#" , ObjectID);
try {
SqlStatistics statistics = null;
RuntimeHelpers.PrepareConstrainedRegions();
try {
#if DEBUG
object initialReliabilitySlotValue = Thread.GetData(TdsParser.ReliabilitySlot);
RuntimeHelpers.PrepareConstrainedRegions();
try {
Thread.SetData(TdsParser.ReliabilitySlot, true);
#endif //DEBUG
statistics = SqlStatistics.StartTimer(Statistics);
// The lock here is to protect against the command.cancel / connection.close
race condition
// The SqlInternalConnectionTds is set to OpenBusy during close, once this
happens the cast below will fail and
// the command will no longer be cancelable. It might be desirable to be
able to cancel the close opperation, but this is
// outside of the scope of Whidbey RTM. See (SqlCommand::Cancel) for other
lock.
lock (InnerConnection) {
InnerConnection.CloseConnection(this, ConnectionFactory);
}
// does not require GC.KeepAlive(this) because of OnStateChange
if (null != Statistics) {
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!