【问题标题】:What is the best way to check for null in Using statement with streamreader? [duplicate]在使用流式阅读器的使用语句中检查 null 的最佳方法是什么? [复制]
【发布时间】:2019-04-17 19:21:57
【问题描述】:

我有一个 HttpWebResponse 和 StreamReader resharper 表明我的 httpResponse.GetResponseStream() 可能为空,但我不确定正确的语法。

using(var httpResponse = (HttpWebResponse)request.GetResponse())
{
     if (httpResponse.StatusCode == HttpStatusCode.OK)
     { 
          //This line is where Resharper Is complaining
          using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
          {
               var result = streamReader.ReadToEnd();
               ...
          }
     }
     else
     {...

【问题讨论】:

  • 事先检查。
  • 除了重复,告诉 ReSharper 闭嘴 :) 这是一个无用的警告
  • “最好的方法”是什么意思?只需将结果与null 进行比较,如果该比较返回false,则该对象不为空...
  • 对不起,我想是因为它是一个我无法事先检查的流,否则它会读到最后,然后不再可用,并且使用负责处理等。 ..但我现在看到这很明显。谢谢大家!

标签: c# .net-core streamreader httpwebresponse


【解决方案1】:

只需检查httpResponse.GetResponseStream() 没有返回空值:

using(var httpResponse = (HttpWebResponse)request.GetResponse())
{
    if (httpResponse.StatusCode == HttpStatusCode.OK)
    {
        var responseStream = httpResponse.GetResponseStream();
        if (responseStream != null)
        {
            // Line reached only if httpResponse.GetResponseStream() isn't null
            using (var streamReader = new StreamReader(responseStream))
            {
                var result = streamReader.ReadToEnd();
                ...
            }
        }
    }
    else
    {
        ...
    }
}

【讨论】:

  • 离题:您可以通过反转您的 if 语句并使用 return: if (responseStream == null) return; 来减少不必要的嵌套。这可以帮助您避免可怕的pyramid of doom
  • 我有点遵循已经存在的代码样式,但是是的,这开始看起来非常嵌套,并且会从一些整理中受益。
  • 很公平。尽管 OP 的情况略有不同,因为它有一个 else 子句(而且由于我们不知道其中的内容,我们不能说 else 子句是否可以使用相同的重构技术删除)。我的评论只是本着分享知识和使代码更简单/更易于阅读的精神。 :)
  • 总的来说,你是对的。但是在这种情况下,我认为这段代码很好,因为它仍然很容易阅读,并且无论上下文如何,它都可以通过复制和粘贴来工作——如果我写了一个空的return,并且包含这段代码的方法恰好返回了一些东西,那么我的代码不会完全按原样工作。无论如何,鉴于此代码非常简单,我认为这两种方式都可以,但我感谢未来的反馈!
  • 是的,通常我会遵循这一点,但如果状态代码不正常,还有更多工作要做,然后我会检查错误并将通知处理给相应的团队/日志,保留这一切仍然是有意义的在这个简短的方法中一起使用,而不是把它分开,因为它们都是逻辑连接的。不过感谢您的注意!
猜你喜欢
  • 2019-12-28
  • 1970-01-01
  • 2010-09-13
  • 2017-09-29
  • 2017-04-27
  • 2011-02-21
相关资源
最近更新 更多