Dispose()在将一次性对象传递到另一个对象的方法或构造函数中后,谁应该调用这些对象,是否有任何指导或最佳做法?
Dispose()
这里有一些关于我的意思的例子。
IDisposable对象被传递到方法中(完成后是否应将其处置?):
public void DoStuff(IDisposable disposableObj) { // Do something with disposableObj CalculateSomething(disposableObj) disposableObj.Dispose(); }
IDisposable对象被传递到方法中并保留引用(在处理时是否应将其处理MyClass?):
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在使用完该对象之前决定处置该对象。对于这种情况有任何标准规则吗?如果有,当将一次性对象传递给构造函数时,它们是否有所不同?
DoStuff()
一般规则是,如果您创建(或获得了)对象的所有权,则有责任处置它。这意味着,如果您在方法或构造函数中收到一次性对象作为参数,则通常不应处置它。
请注意,.NET框架中的某些类 确实会 处置它们作为参数接收的对象。例如,StreamReader配置a 也配置基础Stream。
StreamReader
Stream