MSDNrecommends将实现IDisposable的类的任何实例化放入usingblock中。或者,如果它在try-catchblock中被实例化,则在Finally中执行Dispose。像这样在try-catchblock中使用usingblock有什么问题吗?try{using(Foobar=newFoo()){bar.doStuff();}}catch(Exceptione){//vomite}当然,我可以在Finallyblock中调用Dispose,但我是编程新手,我只是想知道是否做这样的事情这实际上是可以接受的,或者如果有人会拍打我的后脑勺并对我大喊我Doing-It
在C#中处理文件时,我习惯于考虑释放相关资源。通常这是一个using语句,除非它是一个单行方便的方法例如File.ReadAllLines,它将为我打开和关闭文件。.Net4.0引入了便捷方法File.ReadLines。这将返回一个IEnumerable并被称为处理文件的更有效方式-它避免将整个文件存储在内存中。为此,我假设枚举器中有一些延迟执行逻辑。显然,由于此方法返回的是IEnumerable而不是IDisposable,因此我不能按照我对using语句的直觉react去做。我的问题是:考虑到这一点,使用此方法在资源释放方面是否存在任何问题?调用此方法是否意味着关联文件锁的释放是
我如何确定是应该使用IDisposable扩展我的接口(interface)之一还是在实现我的接口(interface)的类上实现IDisposable?我有一个不需要处理任何外部资源的接口(interface),除了一个特定的实现。我的选择似乎是:1)在要求所有实现都实现Dispose的接口(interface)上实现IDisposable,即使只是一个空方法。-或-2)仅在具有需要处理的资源的类上实现IDisposable。这将导致“使用”问题,因为我的对象是从工厂创建的,因此所有上游代码都针对接口(interface)工作。由于该接口(interface)未绑定(bind)IDi
在何处为对象拥有的IDisposable对象调用Dispose()?publicclassMyClass{publicMyClass(){log=newEventLog{Source="MyLogSource",Log="MyLog"};FileStreamstream=File.Open("MyFile.txt",FileMode.OpenOrCreate);}privatereadonlyEventLoglog;privatereadonlyFileStreamstream;//Othermembers,usingthefieldsabove}我应该实现Finalize()吗?对于
我想知道为什么它不能编译?publicstaticvoidMain(string[]args){using(MyStructsss=newMyStruct()){sss.s="fsdfd";//Cannotmodifymembersof'sss'becauseitisa'usingvariable'//sss.Set(12);//butit'sok}}publicstructMyStruct:IDisposable{publicintn;publicstrings;publicvoidSet(intn){this.n=n;}publicvoidDispose(){Console.Wri
如果资源没有实现IDisposable,下面的代码可以工作吗?Tresource=newT();using(resourceasIDisposable){...} 最佳答案 是的。using语句检查它是否被赋予null并避免尝试调用Dispose如果是。来自C#3规范的第8.13节:Ausingstatementistranslatedintothreeparts:acquisition,usage,anddisposal.Usageoftheresourceisimplicitlyenclosedinatrystatementth
在大多数情况下,C#编译器似乎可以自动调用Dispose()。像大多数using模式的情况一样:publicvoidSomeMethod(){...using(varfoo=newFoo()){...}//Fooisn'tuseafterhere(obviously)....}因为foo没有被使用(这是一个非常简单的检测)并且因为它没有作为参数提供给另一个方法(这是一个适用于许多用例并且可以扩展的假设),编译器可以自动并立即调用Dispose(),而无需开发人员要求。这意味着在大多数情况下,如果编译器做了一些聪明的工作,using就毫无用处。IDisposable对我来说似乎低级足以被
通常,当您处置私有(private)成员时,您可能会执行以下操作:publicvoidDispose(){varlocalInst=this.privateMember;if(localInst!=null){localInst.Dispose();}}局部赋值的目的是避免竞争条件,即另一个线程可能在null检查后将私有(private)成员赋值为null。在这种情况下,我不关心Dispose是否在实例上被调用了两次。我一直使用这个模式,所以我写了一个扩展方法来做到这一点:publicstaticvoidSafeDispose(thisIDisposabledisposable){if
我有这个实现了IDisposable的对象PreloadClient,我想处理它,但是在异步方法完成它们的调用之后...这并没有发生privatevoidPreload(SlideHandlerslide){using(PreloadClientclient=newPreloadClient()){client.PreloadCompleted+=client_PreloadCompleted;client.Preload(slide);}//Hereclientisdisposedimmediately}privatevoidclient_PreloadCompleted(objec
我有以下代码:constintbufferSize=1024*1024;varbuffer=newbyte[bufferSize];for(inti=0;i我在32位机器上运行。第一次迭代完成得很好,然后在下一次迭代中,我在newMemoryStream.尽管有using语句,为什么之前的MemoryStream内存没有被回收?如何强制释放MemoryStream使用的内存? 最佳答案 我不认为问题是垃圾收集器没有完成它的工作。如果GC面临内存压力,它应该运行并回收您刚刚分配的400MB。这更有可能是因为GC没有找到连续的400MB