2011-06-29 40 views
2

我有两个代码示例,我想知道什么是他们之间的deifference和哪个更好用明智的最佳实践和性能:在C#中处理和设置引用null有什么区别?

using (TestForm test = new TestForm()) 
{ 
test.ShowDialog(); 
} 

,另一个是:

TestForm test = null; 
try 
{ 
test = new TestForm(); 
test.ShowDialog(); 
} 
catch(Exception ex) 
{ 
} 
finally 
{ 
test = null; 
} 
+0

检查我的答案,我错误地发布它作为评论:) –

回答

7

IDisposable接口定义Dispose方法,以及使用“using”语法的可能性。可以实现类的dispose方法来释放资源,关闭数据库连接以及任何类型的终结和清理。只需将类实例设置为null将不会执行dispose方法中定义的任何代码。作为一个通用规则,如果一个类实现了IDisposable,那么在完成类实例时应该调用dispose。

4

Dispose()用于释放非托管资源。这个可能也可以在终结器中完成(可能会调用Dispose()),但不要依赖它。如果没有完成,那么你泄漏非托管资源。

设置对null的引用仅意味着特定引用不再指向该对象。它可以在一段时间后生活(甚至可以无限期地生活,如果你有另一个参考 - 好吧,如果你有多个对象的引用,那么它可能会变得很难看)。

一般来说,当您完成这些操作后,请始终致电Dispose()IDiposable

using (var foo = new SomeDiposableObject()) { 
    // do something with foo 
} 
-1

IDisposable模式是一个对象,可以消耗及时免费非托管和托管资源的机制:如果你将它们包装成using声明更容易。

模式实现的典型方法如下:

public void Dispose() //Implementes the IDisposable interface 
{ 
    this.Dispose(true); 
    GC.SupressFinalize(this); //All resources have been released, no need to run the finalizer. We make the GC's life a little easier; 
} 

protected void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     //Relesase managed resources. 
    } 

    //Release unmanaged resources. 
} 

~MyDisposableObject() //finalizer 
{ 
    this.Dispose(false) 
} 

这里要注意的一点是,资源通过Dispose方法释放是非常相似的,你在逻辑上希望在一个找一下终结者。它不是在终结直接完成主要有两个原因:

  1. 终结不确定性的顺序执行。这就是为什么我们不处理来自终结器Dispose(false))的管理资源,因为对象所持有的一些或所有受管资源可能已在对象本身之前完成。这对非托管资源来说并非如此,因为根据定义,它们将永远不会被GC最终确定。

  2. 我们不知道终结器运行(它是由GC)。

的基本思路是,实施IDisposable对象为任何消费者说一个牌子:“哎,我持有一定量的非托管和/或管理的资源最终将被释放时GC决定我不再有用,但如果您及时需要这些资源,请拨打Dispose(),我会很乐意提供。“。

另一方面,将参考变量设置为null根本不释放任何资源。 如果从对象中删除的引用是唯一指向该对象的引用,那么对象最终将被GC收集,并且托管和非托管资源将被释放(何时,是否有人猜测)。

如果还有更多的实时引用仍然指向该对象,那么该对象将生活一个,并且任何资源都不会被释放。

相关问题