【问题标题】:Resharper: Possible null assignment to entity marked with notnull attributeResharper:可能对标有 notnull 属性的实体进行空分配
【发布时间】:2012-01-23 21:41:21
【问题描述】:

我在response.GetResponseStream() 收到此警告 我该如何处理?

// Get response  
using (var response = request.GetResponse() as HttpWebResponse)
{
    // Get the response stream  
    if (response != null)
    {
        var reader = new StreamReader(response.GetResponseStream());
        var responseString = reader.ReadToEnd();
        return responseString;
    }
}

出于对某些答案的误解

这一行不是出现警告的地方:

using (var response = request.GetResponse() as HttpWebResponse)

这一行出现警告的地方:

var reader = new StreamReader(response.GetResponseStream());

【问题讨论】:

  • @Uwe Resharper 不知道如何“修复它”
  • @katit 在我的 ReSharper(版本 6)中,它建议在类似情况下检查 null

标签: c# .net resharper


【解决方案1】:
var reader = new StreamReader(response.GetResponseStream());

我怀疑StreamReader 构造函数的参数有一个notnull 属性。请尝试以下操作:

var stream = response.GetResponseStream();
if (stream == null)
  // throw an exception
var reader = new StreamReader(stream);

【讨论】:

  • 在现代 C# 中,只需使用 var reader = new StreamReader(response?.GetResponseStream() ?? Stream.Null); 即可避免警告。
【解决方案2】:

尝试缩短您的代码并将一次性资源包装在 using 语句中:

using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
    return reader.ReadToEnd();
}

甚至更进一步:

using (var client = new WebClient())
{
    return client.DownloadString("http://foo.bar.com/")
}

【讨论】:

  • 我不太了解C#,但using (var reader = new StreamReader(response.GetResponseStream())) 不会得到同样的resharper 警告吗?
【解决方案3】:

如果response 对象的类型为HttpWebRequest,则响应将始终为HttpWebResponse 类型。如果不是,那就永远不会。

要么你在错误的地方测试它(为什么要调用 .GetResponse(),如果你可以通过 WebRequest 派生的另一个类只是为了丢弃结果)或者没有任何效果的不必要的测试。

我猜 resharper 正在担心这一点,尽管它下面的 null 测试。我会选择直接演员:

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();

或者,考虑到您没有使用不是从WebResponse 派生的HttpWebResponse 的任何成员,根本没有强制转换:

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();

【讨论】:

    【解决方案4】:

    您可以使用 C# 的 null conditional operator 来消除警告:

    var reader = new StreamReader(response?.GetResponseStream());
    

    这是一种语法糖,可以避免编写代码来检查运行时引用的空值。这段代码在内部相当于:

    var reader = new StreamReader(response != null ? response.GetResponseStream() : null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2021-08-08
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多