.NET-将嵌套的Using语句替换为单个Using语句#code:using(varresponse=(HttpWebResponse)request.GetResponse()){using(varresponseStream=response.GetResponseStream()){using(varreader=newBinaryReader(responseStream)){//dosomethingwithreader}}}用这样的东西替换它安全吗?using(varreader=newBinaryReader(((HttpWebResponse)request.GetResponse()).GetResponseStream())){//dosomethingwithreader}上面的例子只是一个嵌套一次性资源的例子,所以见谅,如果它不是很正确的用法。我很好奇当你处理最外层的资源(在本例中是BinaryReader)时,它是否会为你递归处理它的子资源,或者你是否需要显式处理每个“使用单独的using语句”层?例如,如果你处理一个BinaryReader,它不应该处理响应流,而响应流又处理响应吗?考虑到最后一句话,我认为你确实需要单独的using语句,因为没有办法保证包装器对象将处理内部对象。对吗?您需要单独的using语句。在第二个示例中,将只处理BinaryReader,而不是用于构造它的对象。要了解原因,请查看using语句实际执行的操作。它需要你的第二个代码并做一些等同于:try{//对reader做点什么}finally{if(reader!=null)((IDisposable)reader).Dispose();如您所见,Response或ResponseStream上从来没有Dispose()调用。您应该只堆叠您的using语句-它具有您正在寻找的预期效果:using(varresponse=(HttpWebResponse)request.GetResponse())BinaryReader(responseStream)){//dosomethingwithreader}FWIW,这里有另一种拼写原始示例的方式来满足嵌套的任何挫败感:using(varresponse=(HttpWebResponse)request.GetResponse())using(varresponseStream=response.GetResponseStream())using(varreader=newBinaryReader(responseStream)){//dosomethingwithreader}阅读器是否处理流实际上是阅读器的一个功能,而不是“使用”。我记得这通常是读者的行为——他们拥有流的所有权并在读者关闭时处理它。但是我上面提供的表格应该没问题。根据文档,BinaryReader.Close将关闭底层流。http://msdn.microsoft.com/en-us/library/system.io.binaryreader.close.aspx此外,根据HttpWebResponse的文档,您必须关闭基础流或处理响应。http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx因此,您提供的第二个示例有效。我已经在其他地方发布了这个,但是用逗号分隔你的语句似乎将每个语句分开成一个新语句并处理它们。using(IType1a=newType1(),b=newType1()){}但是,这意味着您的对象必须属于同一类型。您可以使用(IDisposablea=newType1(),b=newType2()){}调用它们,但当然您只能访问IDisposable方法,不能抛出对象,这有点傻。所以我相信你可以使用using(vara=newType1(),b=newType2()){}这似乎给你一个正确类型的对象引用,允许你访问分配类型的正确方法,并且处理创建的两个对象。如果有人知道我为什么错了,请告诉我,因为这对我有用吗?(我知道这个问题真的很老,但是我在搜索这个答案时自己找到了它)以上是C#学习教程:.NET-Replacingnestedusingstatementswithasingleusingstatementshares的全部内容,如果yes大家有用,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
