C#方法返回未使用的可处理对象

3

我有一个方法Foo,它返回一个IDisposable对象。通常情况下,当调用此方法时,会使用返回值。但是,在这种情况下,我需要调用该方法,但不需要返回值。正确的做法是立即调用Dispose吗?如果是这样的话,下面的哪个方法更好呢?

Foo().Dispose();

或者

using(Foo())
{
}

或者只是
Foo();

1
这可能会有主观性,但我个人偏向于选择第一个选项。 - Abion47
1个回答

4
如果一个对象实现了IDisposable接口,那么当你使用完这个对象后应该调用Dispose方法来释放资源。 Dispose方法旨在释放不应该被保留到下一次垃圾回收周期(或者是那些不受垃圾回收管理的资源)的资源。当垃圾回收器检测到一个对象不再被使用时,它会调用对象的终结器,但我们无法预测什么时候会发生这种情况。因此,IDisposable接口被创建出来,以便程序员可以显式地释放对象的资源(它并不会删除对象,GC仍然会负责这部分工作)。
我认为我更喜欢...
Foo().Dispose();

但这真的不重要(在前两者之间)。如果你只使用"Foo();",那么你就没有遵守Dispose模式,这是不正确的。你可以尝试确定对象正在创建哪些资源,也许有一种方法可以在不创建需要处理的对象的情况下获得所需的信息。


1
请注意,Foo().Dispose() 可能会抛出 NRE 异常。使用 using 更好。 - Alexei Levenkov
非常好的观点,Dispose方法可能会抛出异常,这一点应该考虑到。即使是using语句也不能完全保护(参见:https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx)。 - Dweeberly
忽略那些罕见的糟糕的“Dispose”方法,更有可能是Foo()返回null并导致NRE。 - Alexei Levenkov

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