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



我从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不为空。

相关内容

  • 没有找到相关文章

最新更新