gpt4 book ai didi

c# - 当传递给另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?

转载 作者:IT王子 更新时间:2023-10-29 03:46:33 24 4
gpt4 key购买 nike

是否有关于谁应该调用 Dispose() 的任何指导或最佳实践当一次性对象被传递到另一个对象的方法或构造函数时?

这里有几个例子来说明我的意思。

IDisposable 对象被传递给一个方法(它应该在完成后处理它吗?):

public void DoStuff(IDisposable disposableObj)
{
// Do something with disposableObj
CalculateSomething(disposableObj)

disposableObj.Dispose();
}

IDisposable 对象被传递到一个方法中并保留一个引用(它应该在处理 MyClass 时处理它吗?):
public class MyClass : IDisposable
{
private IDisposable _disposableObj = null;

public void DoStuff(IDisposable disposableObj)
{
_disposableObj = disposableObj;
}

public void Dispose()
{
_disposableObj.Dispose();
}
}

我目前认为在第一个例子中 DoStuff() 的调用者应该处置该对象,因为它可能创建了该对象。但在第二个例子中,感觉就像 MyClass应该处理该对象,因为它保留对它的引用。这样做的问题是调用类可能不知道 MyClass保留了一个引用,因此可能决定在 MyClass 之前处理该对象已经用完了。
这种情况是否有任何标准规则?如果有,当一次性对象被传递给构造函数时,它们是否不同?

最佳答案

一般规则是,如果您创建(或获得了对象的所有权),则您有责任处置它。这意味着,如果您在方法或构造函数中收到一个一次性对象作为参数,您通常不应该处理它。

请注意,.NET 框架中的某些类确实会处理它们作为参数接收的对象。例如处理 StreamReader还处置底层Stream .

关于c# - 当传递给另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4085939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com