我从R#中得到了几个"可能的‘null’赋值给标记有‘NotNull’属性的实体"的指法,例如:
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var reader = new StreamReader(webResponse.GetResponseStream()); // <-- R# hates this line of code
在这种情况下,StreamReader怎么可能为null?如果可以的话,我该如何围绕这种可能性进行防守?
更新
好的,如果我更改这个代码:
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可能为null!"和/或,"小心,reader可能为null",但随后又说,"这是浪费的代码-它们永远不会为null。"
这不是streamreader可能为null,而是webResponse.GetResponseStream()的结果
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var responsestream = webResponse.GetResponseStream();
if(responsestream != null) {
var reader = new StreamReader(responsestream );
}
}
空的不是StreamReader
,而是ReponseStream
。如果您希望警告消失,只需添加一个检查以确保返回的ResponseStream
不为空。