Почему Resharper дает мне это нарушение ограничений, и как я могу умиротворить его?
Я получаю несколько "Возможных" нулевых "назначений для сущности, помеченной атрибутом" 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 "", все еще относится к той же строке. Так, как я могу нанести ядерный удар R#? ISTM, что "использование" обернул бы необходимую проверку для нуля...
ОБНОВЛЕНИЕ 2
Решарпер жалуется на эту строку:
var reader = new StreamReader(webResponse.GetResponseStream());
... " Возможное" нулевое "назначение объекту, отмеченному атрибутом " NotNull " "
Поэтому я изменил его, чтобы проверить как 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 может быть нулевым!" и / или "Осторожно! читатель может быть нулевым!" но затем говорят: "Это потраченный впустую код - они никогда не будут нулевыми".
2 ответа
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var responsestream = webResponse.GetResponseStream();
if(responsestream != null) {
var reader = new StreamReader(responsestream );
}
}
Это не StreamReader
это ноль, это ReponseStream
, Просто добавьте проверку, чтобы убедиться, что возвращенный ResponseStream
не является нулевым, если вы хотите, чтобы предупреждение исчезло.
Это не потоковый читатель, который может быть нулевым, это результат webResponse.GetResponseStream()