当前位置: 首页 > 编程语言 > C#

分享关于IDisposable的问题

时间:2023-04-10 19:17:22 C#

关于IDisposable的问题我的问题是为什么需要IDisposable?我有一个类消耗一些需要释放的资源。我有两个选择否IDisposableclassSomeUtilityClass{publicStop(){//免费资源}}使用IDisposableclassSomeUtilityClass,IDisposable{publicvoidDispose(){//免费资源}}为什么我需要IDisposable?它没有如何命名函数。类程序{publicMain(..){SomeUtilityClass_class=newSomeUtilityClass();//完成后清理_class.Stop();//或_class.Dispose();由于IDis支持IDisposable,您可以使用很酷的using语法:using(IDisposablesomeDisposable=new...){//yourcodewithsomeDisposable}这实际上由编译器翻译为:IDisposablesomeDisposable=new...IDisposablesomeDisposable2=someDisposable;try{//你的代码带有someDisposable}finally{if(someDisposable2!=null){someDisposable2.Dispose();因此,如果在using块内发生任何异常,该对象将被释放。当您的类消耗非托管资源并需要立即释放它们(流、数据库等)时,您应该只使用IDisposable。当仍有未处理的异常导致您的线程被卸载时,它还为CLR提供了一种“清理”方法。调用IDisposable将对象标记为立即可用于垃圾回收,但如果未正确实现,可能会导致对象被提升为垃圾回收生成,这可能会导致内存压力(如果您想要完整的解释,请参阅Viac#3JefferyRichtersCLR)。快速谷歌转向这个:http://kleahy-technical.blogspot.com/2009/01/idisposable-and-garbage-collection.html我建议你阅读IDisposable模式,何时使用它,何时不使用它及其对GC和状态的影响。编辑:还有大量关于stackoverflow的信息:Usinggarbagecollection?那么在您的情况下,实施IDisposable没有多大意义,因为您可以手动处理资源。IDisposable的一个常见用途是当您公开一个处理数据连接的接口并且您希望所有派生类在完成时处理它。考虑一下:publicinterfaceIDataCtx{voidCallDB();}publicclassMyDataCtx:IDataCtx{privateSqlConnectiondc;publicMyDataCtx(){dc=newSqlConnection();dc.Open();}publicvoidCallDB();{dc.Something();}}允许您执行以下操作:IDataCtxctx=newMyDataCtx();ctx.CallDB();但是等等,那个打开的连接呢?哦哦!如果您创建IDataCtx:IDisposable(并在派生的ctx中实现代码),您可以这样做:IDataCtxctx;使用(ctx=newMyDataCtx()){ctx.CallDB();}保证无论你使用什么IDataCtx,它都会被处理掉(即使在特殊情况下)。无论如何,这就是我使用它的方式。(加上这只是一个好习惯)。IDisposable与using关键字交互,以便在其自身之后轻松清理,例如:using(varfile=newFileStream(...)){file.Write(...);在上面的代码中,FileStream是在using块中声明的,完成后立即关闭,而不是等待垃圾回收。这是C#语言中使用的约定。您也可以很好地使用声明。using(SomeUtilityClass_class=newSomeUtilityClass()){}//自动调用Dispose除了可以使用using语句外,它还向垃圾收集器提供了一个提示,可以将对象从内存中移除。如果您的类拥有非托管资源或您的类拥有托管IDisposable资源,那么您应该实现IDisposable接口。关于何时实现IDisposable和Finalizer的小而易读的文章可以在这里找到:http://nitoprograms.blogspot.com/2009/08/how-to-implement-idisposable-and.html以上是C#学习教程:所有分享的关于IDisposable的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: