Resharper:可能对标有 notnull 属性的实体进行 null 赋值

发布于 2024-12-28 08:20:48 字数 699 浏览 2 评论 0原文

我在 response.GetResponseStream() 上收到此警告 我应该如何处理这个问题?

// Get response  
using (var response = request.GetResponse() as HttpWebResponse)
{
    // Get the response stream  
    if (response != null)
    {
        var reader = new StreamReader(response.GetResponseStream());
        var responseString = reader.ReadToEnd();
        return responseString;
    }
}

为了清楚起见,基于一些误解的答案

此行不是发生警告的位置:

using (var response = request.GetResponse() as HttpWebResponse)

此行发生警告的位置:

var reader = new StreamReader(response.GetResponseStream());

I get this warning on response.GetResponseStream()
How should I handle this?

// Get response  
using (var response = request.GetResponse() as HttpWebResponse)
{
    // Get the response stream  
    if (response != null)
    {
        var reader = new StreamReader(response.GetResponseStream());
        var responseString = reader.ReadToEnd();
        return responseString;
    }
}

For clarity based on some answers misinterpreting:

This line is not where the warning is occurring:

using (var response = request.GetResponse() as HttpWebResponse)

This line is where the warning is occurring:

var reader = new StreamReader(response.GetResponseStream());

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

献世佛 2025-01-04 08:20:48
var reader = new StreamReader(response.GetResponseStream());

我怀疑 StreamReader 构造函数的参数具有 notnull 属性。请尝试以下操作:

var stream = response.GetResponseStream();
if (stream == null)
  // throw an exception
var reader = new StreamReader(stream);
var reader = new StreamReader(response.GetResponseStream());

I suspect StreamReader constructor's parameter has a notnull attribute. Try the following:

var stream = response.GetResponseStream();
if (stream == null)
  // throw an exception
var reader = new StreamReader(stream);
花海 2025-01-04 08:20:48

尝试缩短代码并将一次性资源包装在 using 语句中:

using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
    return reader.ReadToEnd();
}

甚至更进一步:

using (var client = new WebClient())
{
    return client.DownloadString("http://foo.bar.com/")
}

Try shortening your code and wrapping disposable resources in using statements:

using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
    return reader.ReadToEnd();
}

or even further:

using (var client = new WebClient())
{
    return client.DownloadString("http://foo.bar.com/")
}
对风讲故事 2025-01-04 08:20:48

如果 response 对象的类型为 HttpWebRequest,则响应将始终为 HttpWebResponse 类型。如果不是,那就永远不会。

要么你在错误的地方测试它(如果你可以传递由 WebRequest 派生的另一个类只是为了丢弃结果,为什么要调用 .GetResponse() )或测试不必要且没有效果。

我猜 resharper 正在担心这一点,尽管在它下面进行了 null 测试。我会选择直接强制转换:

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();

或者,考虑到您没有使用任何不是从 WebResponse 派生的 HttpWebResponse 成员,根本不进行强制转换:

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();

If the response object is of type HttpWebRequest, then response will always be of type HttpWebResponse. If it's not, then it never will be.

Either you're testing this at the wrong place (why call .GetResponse() if you could be passed another class derived by WebRequest just to throw away the results) or testing unnecessary with no effect.

I'm guessing resharper is worrying about that, despite the test for null below it. I'd go for either a direct cast:

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();

Or, considering you aren't using any members of HttpWebResponse that isn't derived from WebResponse, no cast at all:

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();
晒暮凉 2025-01-04 08:20:48

您可以使用 C# 的 空条件运算符来消除警告:

var reader = new StreamReader(response?.GetResponseStream());

它是一种语法糖,可以避免编写在运行时检查引用的空值的代码。在内部,这段代码相当于:

var reader = new StreamReader(response != null ? response.GetResponseStream() : null);

You can use C#'s null conditional operator to get rid of the warning:

var reader = new StreamReader(response?.GetResponseStream());

It is a syntactic sugar to avoid writing code for checking null value of a reference at runtime. Internally this code is equivalent to :

var reader = new StreamReader(response != null ? response.GetResponseStream() : null);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文