【问题标题】:Using a returned instance?使用返回的实例?
【发布时间】:2021-09-28 08:46:34
【问题描述】:

我有一个执行 API 请求的类层次结构。在基类中,我构建了请求对象,在一些子类中,这个方法被覆盖了。

基类:

      protected virtual HttpRequestMessage BuildRequest(HttpMethod method, Uri uri, HttpContent content = null)
      {
           HttpRequestMessage request = new HttpRequestMessage(method, uri);
           if (null != content)
           {
                request.Content = content;
           }

           return request;
      }

子类:

      protected async override HttpRequestMessage BuildRequest(HttpMethod method, Uri uri, HttpContent content = null)
      {
           HttpRequestMessage request = await base.BuildRequest(method, uri, content);
           request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessTokenHelper.GetAccessToken());

           return request;
      }

其他使用 BuildRequest() 方法的方法中的 then 语句:

      using HttpRequestMessage request = BuildRequest(HttpMethod.Post, url, content);

如您所见,我是 using 返回的实例。这是否也会正确处理每个 BuildRequest() 方法中的 HttpRequestMessage 实例?或者这是在数万次请求后的经典内存泄漏情况?

【问题讨论】:

  • 这里只有一个HttpRequestMessage 实例,在第一个BuildRequest 中构造,所以是的,这个实例将被释放。所有变量都引用这个单一实例。
  • 哇,感谢您的快速回复!我猜的差不多了,但我想在部署这段代码之前确定一下,因为我们之前遇到过不愉快的事情,IDisposables 之前没有得到正确处理......

标签: c# using


【解决方案1】:

如果您查看代码,则会创建一个实例:

HttpRequestMessage request = new HttpRequestMessage(method, uri);

其他 2 行仅获取对上面创建的实例的引用:

HttpRequestMessage request = await base.BuildRequest(method, uri, content);
using HttpRequestMessage request = BuildRequest(HttpMethod.Post, url, content);

因此,通过使用using HttpRequestMessage request = BuildRequest(HttpMethod.Post, url, content);,您正确地处理了在基本BuildRequest 方法中创建的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多