C# 在静态方法中是否需要在finally块中处理变量?

C# 在静态方法中是否需要在finally块中处理变量?,c#,garbage-collection,dispose,idisposable,finally,C#,Garbage Collection,Dispose,Idisposable,Finally,下面这个例子是我在寻找另一个问题的答案时发现的。 在这里,那个家伙在finally块中处理响应。 真的有必要吗?在这种情况下是GC的工作吗 public static async Task EnsureSuccessStatusCodeAsync(this HttpResponseMessage response) { try { if (response.IsSuccessStatusCode) r

下面这个例子是我在寻找另一个问题的答案时发现的。 在这里,那个家伙在finally块中处理
响应。
真的有必要吗?在这种情况下是GC的工作吗

public static async Task EnsureSuccessStatusCodeAsync(this HttpResponseMessage response)
    {
        try
        {
            if (response.IsSuccessStatusCode)
                return;
            var content = await response.Content.ReadAsStringAsync();
            throw new SimpleHttpResponseException(response.StatusCode, content);
        }
        finally
        {
            response.Content?.Dispose();
        }
    }

使用
IDisposable
的全部目的是清理GC无法自行清理的非托管资源。所以不,你不能让GC清理它,因为根据定义,它不能。我不太喜欢处理作为参数传递的对象。。。这有点。。。我不知道。。。不漂亮。。。不坏,但不好。但代码是正确的。。。如果可能/不太难,您应该始终
Dispose()
IDisposable
对象。。。它有助于GC。。。你不能保证GC会运行。如果没有内存压力,GC将无法长时间运行。@xanatos-GC从未调用
.Dispose()
。必须显式执行。如果正确实现的
IDisposable
模式管理非托管资源,则该模式具有终结器,因此即使未调用
Dispose()
,在下一次GC运行时,所有填充都将被修复。不正确的
IDisposable
模式根据定义是不正确的,因此它们甚至不能释放所有内容:-)因此
Dispose()
的唯一用途是确保确定性和及时地释放非托管资源。但问题是,至少在这种情况下,由于该方法不拥有
HttpResponseMessage
,因此该方法是否应该对其(或其内容)调用
Dispose
。如果所有者随后调用
Dispose
,这将导致异常。我试图查找源代码,但我假设在其
Content
属性上处理
HttpResponseMessage
调用
Dispose
,这不会导致以后难以跟踪的问题吗?@xanatos finalizers可能会清理资源。在很多情况下,它们根本不会运行。它们在设计上是不可靠的。对于需要可靠清理的资源,您需要手动处理它们。还有很多可使用的资源没有终结器。假设每个一次性资源都必须实现终结器是不正确的,就像假设终结器必须运行一样。一次性资源不实现终结器并不是“不正确的”。@RonBeyer不知道方法的意图及其使用的上下文,这很难评论。似乎创建此方法的目的是在完成时清理对象。我们没有足够的信息来评论这个特定操作是否有意义。@RonBeyer无论是
HttpResponseMessage
还是
HttpContent
都正确地完成了(其中正确的意思是“微软在MSDN上建议的”),并且可以接受多个
Dispose()
没有任何问题