Resharper:可能为用notnull属性标记的实体赋值为null

本文关键字:实体 null 赋值 notnull Resharper 属性 | 更新日期: 2023-09-27 18:21:07

我在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());

Resharper:可能为用notnull属性标记的实体赋值为null

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

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

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

尝试缩短代码并将可丢弃资源包装在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/")
}

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

要么你在错误的地方测试了这个(如果你可以通过WebRequest派生的另一个类来丢弃结果,那么为什么要调用.GetResponse()呢),要么测试不必要而没有效果。

我猜重拍者对此感到担忧,尽管下面的测试是null

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

或者,考虑到您没有使用任何非源自WebResponseHttpWebResponse成员,因此根本没有强制转换:

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

您可以使用C#的null条件运算符来消除警告:

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

避免编写用于在运行时检查引用的null值的代码是一种语法糖。在内部,该代码等效于:

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