Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从方法返回iDisposable-谁负责处理?_C#_.net_Idisposable - Fatal编程技术网

C# 从方法返回iDisposable-谁负责处理?

C# 从方法返回iDisposable-谁负责处理?,c#,.net,idisposable,C#,.net,Idisposable,给定以下代码: using (var webResponse = GenerateWebrequest(postURL, postParameters)) { using (var stream = webResponse.GetResponse()) { if (stream != null) { xmlDoc.Load

给定以下代码:

    using (var webResponse = GenerateWebrequest(postURL, postParameters))
        {
            using (var stream = webResponse.GetResponse())
            {
                if (stream != null)
                {
                    xmlDoc.Load(stream);
                }
            }

            webResponse.Close();
        }
它调用以下方法:

private HttpWebResponse GetResponse(string postUrl, byte[] formData)
    {
       var request = WebRequest.Create(postUrl) as HttpWebRequest;
       //other code to set up request here...

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(formData, 0, formData.Length);
            requestStream.Close();
        }

        return request.GetResponse() as HttpWebResponse;
    }
我的问题基本上是:

调用代码将方法调用包装在using中,并处理响应流

但是,如果GenerateWebrequest中的request.GetResponse()失败,该怎么办?
我应该简单地把它包在试一试中吗?那我该怎么办

对于返回
IDisposable
对象的方法,有一种特殊的模式:

HttpWebRequest tmpRequest;
try
{
  tmpRequest = WebRequest.Create(postUrl) as HttpWebReqeust;

  // Whatever other stuff...

  // When all other work is done. No code that can cause an exception
  // should exist below this line.
  var returnRequest = tmpReqeust;
  tmpRequest = null;

  return returnRequest;
}
finally
{
  if(tmpRequest != null)
    tmpRequest.Dispose();
}

该模式还适用于创建嵌套的
IDisposable
对象的构造函数和创建多个
IDisposable
对象的方法。

否。如果该方法失败,则必须引发异常。不必担心返回任何内容。上面的模式在语义上是正确的,我不知道有哪种语义正确的模式更好,但它仍然很难看。使用
success
标志并在
success
为false时使用
finally
块dispose things if
success
将允许更好的重构,前提是/when C#为
finally
块添加一个干净的语法,以确定其
try
块是否成功,而不影响首次通过的异常处理序列。