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());
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();
或者,考虑到您没有使用任何非源自WebResponse
的HttpWebResponse
成员,因此根本没有强制转换:
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);