为什么Resharper会给我这种违反约束的行为,我该如何安抚它呢?

时间:2013-11-23 00:43:01

标签: c# resharper streamreader webresponse responsestream

我得到几个“可能'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认为“使用”会包含对空的必要检查...

更新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)
    {

...但是我得到了,“ Expression总是如此”对于这两个“!=”测试;所以它似乎在说,“小心!webResponse可能是空的!”和/或,“小心!读者可能无效!”但随后说,“这是浪费的代码 - 它们永远不会是空的。”

2 个答案:

答案 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}}不为空。