我得到几个“可能'null'赋值给标记为'NotNull'属性的实体”来自R#的指纹,例如:
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认为“使用”会包含对空的必要检查...
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)
{
...但是我得到了,“ Expression总是如此”对于这两个“!=”测试;所以它似乎在说,“小心!webResponse可能是空的!”和/或,“小心!读者可能无效!”但随后说,“这是浪费的代码 - 它们永远不会是空的。”
答案 0 :(得分:3)
不是流读取器可能为null,而是webResponse.GetResponseStream()
的结果答案 1 :(得分:2)
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var responsestream = webResponse.GetResponseStream();
if(responsestream != null) {
var reader = new StreamReader(responsestream );
}
}
StreamReader
不是ReponseStream
,而是ResponseStream
。
只需添加一个检查,以确保如果您希望警告消失,则返回的{{1}}不为空。