0

我从 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 可能为空!” 和/或,“小心!阅读器可能为空!” 但接着说,“那是浪费的代码——它们永远不会为空。”

4

2 回答 2

4

可能为空的不是流读取器,而是 webResponse.GetResponseStream() 的结果

于 2013-11-23T00:46:05.503 回答
2
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var responsestream = webResponse.GetResponseStream();
    if(responsestream != null) {
        var reader = new StreamReader(responsestream );
    }
}

不是StreamReader那为空,而是ReponseStream. ResponseStream如果您希望警告消失,只需添加一个检查以确保返回不为空。

于 2013-11-23T00:47:23.733 回答