我应该在返回实现IDisposable的对象后调用.Dispose()吗?
myDisposableObject Gimme() {
//Code
return disposableResult;
disposableResult.Dispose();
}
换句话说,对象是我返回一个副本,还是对象本身?谢谢:))
答案 0 :(得分:9)
此外,即使存在应该使用的情况,也不能使用类似的代码处理对象。 return
语句之后的代码将永远不会执行,您将收到有关无法访问代码的警告。
答案 1 :(得分:8)
这是对象本身。不要在这里调用Dispose,即使你颠倒顺序以便调用它。
答案 2 :(得分:7)
到目前为止,没有一个答案提到的一件事是,如果Gimme抛出异常,你应该处理对象。例如:
MyDisposableObject Gimme()
{
MyDisposableObject disposableResult = null;
try
{
MyDisposableObject disposableResult = ...
// ... Code to prepare disposableResult
return disposableResult;
}
catch(Exception)
{
if (disposableResult != null) disposableResult.Dispose();
throw;
}
}
答案 3 :(得分:4)
disposableResult.Dispose();将永远不会运行,它是无法访问的代码,因为它将始终返回该行。将方法调用包装在一个使用方法中并以这种方式处理该对象 e.g。
using (DisposeableObject myDisposableObject = gimme())
{
//code.
}
答案 4 :(得分:3)
无论如何都永远不会达到.Dispose()
。
编辑:在我看来,不,你不应该。你用它破坏了对象。
答案 5 :(得分:3)
如果您使用的对象实现IDisposable
,则应在using
语句中构造和使用 - 这将确保它被正确处理:
using(var mydisposableObject = new Gimme())
{
// code
}
构建代码的方式是,您返回一次性对象,因此永远不会调用Dispose
。
答案 6 :(得分:2)
如果您返回该对象,则在返回之前应不处理该对象。必须由呼叫者来处理它。
答案 7 :(得分:1)
此行:disposableResult.Dispose();
将不会被执行。返回的“东西”不是对象的副本。它是对象的引用,因此调用者将操纵在Gimme
中创建的对象,并且他(调用者)应该记住处置该对象。
答案 8 :(得分:1)
您可以将代码包装在try / finally块中
try{
int a = 0;
return;
}
finally{
//Code here will be called after you return
}
答案 9 :(得分:1)
我同意不要处理它通过引用传递的这个对象。当产生一个类包装另一个类并分配对象时,我可以想到一个特殊的情况:你不希望分配的对象是一个引用同一个,以便您克隆或传递对象的副本并销毁原始对象,但是如果原始对象是该类型的所有生成的标准图像,则不会专门为每个调用创建对象,并且您预期会产生数字。您可能希望保留它的一小段时间,因为您可以从该图像生成一个新对象,而无需再次实例化它。我会选择将此处的所有属性锁定为只读并将只读对象转换为读/写可以在reallworld中使用的对象。当它作为值复制或克隆传递时,该对象不应该在其自身内运行任何线程,但是如果它是线程,只要引用是1对1的关系,如果你有多个指针,那么传递它的引用是完全正确的。对于同时读取和写入“正在运行的图像”对象的对象,您可能会开始在没有安全存储值的情况下进行冲突,并且下一个pinger请求并分配相同的值。我在学校学到很大程度上没有讨论的一件事是对象状态。面向对象的主体是根深蒂固的,但理解它们为什么建立起来总是需要时间..我是后面的词我学会了面向对象的风格然后转向更多的程序风格。
答案 10 :(得分:0)
myDisposableObject disposableResult = new myDisposableObject();
此处disposableResult
是对创建的新对象的引用。因此,当您返回对调用方法的引用时,该引用仍然指向堆中创建的对象。因此,您可以安全地将其置于调用方法中。
答案 11 :(得分:0)
你不能在返回的方法中使用.Dispose()。调用者应该实现它。