我在函数中使用Return之后应该调用Dispose()吗?

9
在返回实现IDisposable接口的对象后,我是否应该调用.Dispose()方法?
myDisposableObject Gimme() {
  //Code
  return disposableResult;
  disposableResult.Dispose();
}

换句话说,我返回的对象是一个副本还是原始对象本身?谢谢 :)

@AMissico:“释放返回的对象不是方法的责任。”不幸的是,这并不总是正确的。对于某些方法和某些属性获取器,调用方需要负责释放返回的对象,而对于其他情况,则不需要,因为该对象被缓存到其他地方并在其他地方释放。显然,没有简单的规则可以找出哪种情况,除了通过试错。 - Niki
2
另外,如果我说错了,请有人纠正我,你的最后一行代码实际上永远不会被调用,因为 return 语句会退出该方法。 - Chris Haas
@nikie:在托管代码中,这总是正确的。我不知道.NET Framework库中有任何例外情况。(通常涉及Interop到非托管代码的例外情况。)显然,您不会仅因为它实现了“IDisposable”而Dispose一个对象。没有要求您调用“Dispose”。接口允许程序员在对象不再需要时“清理”非托管资源。这是.NET Framework设计目标的一部分。为消除程序员处理内存管理和与内存相关的错误的需要。 - AMissico
1
@nikie:“显然,没有简单的规则可以找出哪个除了试错之外;”我完全不同意。阅读有关该对象的文档即可。 - AMissico
对象的所有者应该处理它。这是一个工厂。工厂创建对象。除非实例是单例并且工厂拥有其生命周期,否则不应该处理它。而且,如果工厂在将对象交给您之前处理它,那么它还有什么用处呢?此外,在返回后放置任何代码(没有try/finally块)基本上是无用的,编译器应该会给出一个无法访问的代码警告。 - BrainSlugs83
显示剩余25条评论
12个回答

0

myDisposableObject disposableResult = new myDisposableObject();

这里disposableResult是对新创建的对象的引用。因此,当您将该引用返回给调用方法时,该引用仍指向堆中创建的对象。因此,您可以在调用方法中安全地处理它。


0

在返回的方法中,您不能使用.Dispose()。调用者应该自行实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接