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

有没有比嵌套“using”更好的确定性配置模式?分享

时间:2023-04-11 00:15:34 C#

有比嵌套“using”更好的确定性处置模式吗?在C#中,如果我想确定性地清理非托管资源,我可以使用“using”关键字。但是对于多个依赖对象,这最终会进一步嵌套:=newStreamReader(bs)){//使用sr,并在完成后清理所有内容。在C++中,我习惯于使用析构函数来执行此操作:{FileStreamfs("c:file.txt",FileMode.Open);缓冲流bs(fs);StreamReadersr(bs);//使用sr,并在完成后清理所有内容。在C#中有更好的方法吗?还是我坚持使用多层嵌套?您不必嵌套多个用途:bs)){//当你完成后,所有三个都被处理掉}你可以像这样在左花括号之前将using语句放在一起:using(StreamWriterw1=File.CreateText("W1"))using(StreamWriterw2=File.CreateText("W2")){//代码在这里}http://blogs.msdn.com/ericgu/archive/2004/08/05/209267.aspx你可以用这个语法压缩一下:使用(FileStreamfs=newFileStream("c:file.txt",FileMode.Open))using(BufferedStreambs=newBufferedStream(fs))using(StreamReadersr=newStreamReader(bs)){}这是罕见的情况,不使用{}对所有块都有意义恕我直言坦率地说,你可以手动写出.Dispose调用而不是用语句嵌套它,但你几乎肯定会在某个时候错过它。运行FxCop或其他东西以确保所有IDisposable实现类型实例都有一个.Dispose()调用或disposeofthenested我之前实现过类似MichaelMeadows的解决方案,但是他的StreamWrapper代码没有考虑到调用成员变量的Dispose()方法会因为某种原因抛出异常,后续的Dispose()es将不会将会发出呼叫,资源可能会来回摆动。一个更安全的方法是:varexceptions=newList();尝试{this.sr.Dispose();}catch(Exceptionex){exceptions.Add(ex);}尝试{this.bs.Dispose();}catch(Exceptionex){exceptions.Add(ex);}尝试{this.fs.Dispose();}catch(Exceptionex){exceptions.Add(ex);}if(exceptions.Count>0){thrownewAggregateException(exceptions);您可以省略大括号,例如:using(FileStreamfs=newFileStream("c:file.txt",FileMode.Open))(bs)){//使用sr,并在完成后清理所有内容。或使用通常的try-final方法:FileStreamfs=newFileStream("c:file.txt",FileMode.Open);BufferedStreambs=newBufferedStream(fs);StreamReadersr=newStreamReader(bs);try{//使用sr,并在完成后清理所有内容。}最后{sr.Close();//应该足够了,因为你将控制权交给了读者}这样你就可以在代码行中获得更大的网络,但在可读性方面有明显的好处:使用(StreamWrapperwrapper=newStreamWrapper("c:file.txt",FileMode.Open)){//dostuffusingwrapper.Reader}StreamWrapper定义在这里:privateclassStreamWrapper:IDisposable{privatereadonlyFileStreamfs;私有只读BufferedStreambs;私有只读StreamReadersr;publicStreamWrapper(stringfileName,FileModemode){fs=newFileStream(fileName,mode);bs=newBufferedStream(fs);sr=新的StreamReader(bs);}publicStreamReaderReader{get{returnsr;}}publicvoidDispose(){sr.Dispose();bs.Dispose();fs.Dispose();通过一些努力,可以将StreamWrapper重构为更通用和可重用创建流时,新流将关闭传入流。因此,为了进一步减少您的示例:使用(StreamReadersr=newStreamReader(newBufferedStream(newFileStream("c:file.txt",FileMode.Open)))){//当您完成时,所有三个都会被处理掉对于此示例,我们假设您有:c:下的一个名为1.xml的文件一个名为textBox1的文本框,其多行属性设置为ON。conststringfname=@"c:1.xml";StreamReadersr=newStreamReader(newBufferedStream(newFileStream(fname,FileMode.Open,FileAccess.Read,FileShare.Delete)));textBox1.Text=sr.ReadToEnd();using语句是语法糖,可以翻译为:try{objdeclaration...}finally{obj.Dispose();您可以在对象上显式调用Dispose,但它不会那么安全,因为如果抛出其中一个异常,资源将不会被正确释放。以上是C#学习教程:有比嵌套“using”更好的确定性配置模式吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: