我从 R# 在代码中得到了几个“可能的‘null’分配给标记有‘NotNull’属性的实体”的手指,例如:
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var reader = new StreamReader(webResponse.GetResponseStream()); // <-- R# hates this line of code
在这种情况下,StreamReader 怎么可能为空?如果可以,我该如何围绕这种可能性进行防御性编程?
更新
好的,如果我更改此代码:
String strResult;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
using (var sr = new StreamReader(objResponse.GetResponseStream()))
{
strResult = sr.ReadToEnd();
sr.Close();
}
return strResult;
...对此:
String strResult = string.Empty;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
using (var sr = new StreamReader(objResponse.GetResponseStream()))
{
if (sr != null)
{
strResult = sr.ReadToEnd();
sr.Close();
}
}
return strResult;
...我仍然在同一条(“使用”)线上得到相同的手指。
如果我将其更改为:
String strResult = string.Empty;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
if (objResponse != null)
{
using (var sr = new StreamReader(objResponse.GetResponseStream()))
{
strResult = sr.ReadToEnd();
sr.Close();
}
}
return strResult;
...“对标有 'NotNull' 属性的实体的可能的 'null' 分配”仍然指的是同一行。那么我怎样才能对 R# 的手指摇动进行核打击呢?ISTM 认为“使用”将结束对 null 的必要检查......
更新 2
Resharper 在这条线上抱怨:
var reader = new StreamReader(webResponse.GetResponseStream());
..."可能对标有 'NotNull' 属性的实体进行 'null' 分配"
所以我将其更改为同时检查 webResponse 和阅读器:
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse != null) && (webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var reader = new StreamReader(webResponse.GetResponseStream());
if (reader != null)
{
...但后来我得到,对于这两个“!=”测试,“表达式总是正确的”;所以它似乎在说,“小心!webResponse 可能为空!” 和/或,“小心!阅读器可能为空!” 但接着说,“那是浪费的代码——它们永远不会为空。”