最近我一直在处理一次性物体,我想知道将一个物体放在一个功能中是否有用? 在这两个函数之间使用 .Dispose()在函数内部非常重要,因为函数中的所有对象一旦完成就会消失
void FOO()
{
var x= new DisposableObject();
//stuff
}
void FOO()
{
using(var x= new DisposableObject())
{
//stuff
}
}
答案 0 :(得分:6)
您应始终Dispose()
需要它的对象。即使对象是垃圾回收,也可能存在未释放的非托管资源。在第二个示例中调用Dispose()
(或using
)可确保对象可以正确释放所需的非托管资源。
答案 1 :(得分:2)
对象不会简单地消失。
GC会收集不再引用的实例。这可能需要一些时间,因为GC决定何时运行,并且实例将不会被处理,直到它发生。
如果此一次性使用非托管资源并且正确实现,则资源将由终结器处理,该终结器是单个线程。
如果您对该实例未被处理一段时间并且终结器不忙,那么请继续。但如果你尽快处理它会好得多。
答案 2 :(得分:2)
函数中的所有对象一旦完成就会消失
对象将保留,本地引用将消失。物体将会消失。当垃圾收集器运行并确定它们无法访问时。
在从内存中删除无法访问的对象之前,它的终结器将运行(如果已实现),清除所有非托管资源。
问题在于所有这些都不是确定性的。你永远不知道GC什么时候会运行,在某些情况下甚至不会执行终结器。
如果可行的话,您应该始终致电Dispose
方法。
答案 3 :(得分:1)
在Dispose()方法中设置断点并使用调试运行这些测试。 在TestMethod2执行时,TestMethod1没有到达断点。
正如其他人所说,这是因为GC在.Net中的运作方式 如果您要实现IDiisposeable接口,您可能希望将您的类放在using语句中或调用.Dispose(),以便您有更可预测的应用程序行为。
protected void pickFile(View view){
///Codigo que abre la galeria de imagenes y carga la imagen en displayedImage
Intent intent = new Intent();
intent.setType("file/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Choose File to Upload"), 1);
}
//It's executed when leaving file system
@Override
protected void onActivityResult(int reqCode, int resCode, Intent data){
super.onActivityResult(reqCode, resCode, data);
if (reqCode == 1 && resCode == RESULT_OK && data != null) {
Uri selectedFile = data.getData();
RequestMaker.uploadFile(this, selectedFile, "this is a file");
}
}