WEB开发网
开发学院软件开发C语言 Effective C# 原则18:实现标准的处理(Dispose)模... 阅读

Effective C# 原则18:实现标准的处理(Dispose)模式

 2009-02-19 08:16:44 来源:WEB开发网   
核心提示: public class BadClass{// Store a reference to a global object:private readonly ArrayList _finalizedList;private string _msg;public BadClass( Arra

public class BadClass
{
 // Store a reference to a global object:
 private readonly ArrayList _finalizedList;
 private string _msg;
 public BadClass( ArrayList badList, string msg )
 {
  // cache the reference:
  _finalizedList = badList;
  _msg = (string)msg.Clone();
 }
 ~BadClass()
 {
  // Add this object to the list.
  // This object is reachable, no
  // longer garbage. It's Back!
  _finalizedList.Add( this );
 }
}

当一个BadClass对象的析构函数执行时,它把自己的一个引用添加到了全局的链表中。这使得它自己又是可达的,它就又活了。前面向你介绍的这个方法会遇到一些让人畏缩的难题。对象已经被析构了,所以垃圾回收器从此相信再也不用调用它的析构函数了。如果你实际要析构一个可达对象,这将不会成功。其次,你的一些资源可能不再有用。GC不再从内存上移除那些只被析构队列引用的对象,但它们可能已经析构了。如果是这样,它们很可能已经不能使用了。(译注:也就是说利用上面的那个方法让对象复活后,很有可能对象是不可用的。)尽管BadClass所拥有的成员还在内存里,它们像是可以被析构或者处理,但C#语言没有一个方法可以让你控制析构的次序,你不能让这样的结构可靠的运行。不要尝试。

我还没有看到这样的代码:用这样明显的方式来复活一个对象,除非是学术上的练习。但我看过这样的代码,析构函数试图完成一些实质的工作,最后还通过析构函数的调用把引用放到对象中,从而把自己复活。析构函数里面的代码看上去是精心设计的,另外还有处理函数里的。再检查一遍,这些代码是做了其它事情,而不是释放资源!这些行为会为你的应用程序在后期的运行中产生很多BUG。删除这些方法,确保析构函数和Dispose()方法除了清理资源外,什么也不做。

在托管环境里,你不用为每一个创建的类写析构函数;只有须要释放一些使用的非托管资源时才添加,或者你的类所包含的成员有实现了IDisposable接口的时候也要添加。即使如此,你也只用实现IDisposable接口完成所有的功能就行了,不用析构函数。否则,你会限制你的派生类实现实现标准的Dispose习惯。 遵守这个我所讲叙的标准的Dispose习惯。这会让你的程序生活变得轻松,也为你的用户,也为那些从你的类创建派生类的人。

上一页  1 2 3 4 5 

Tags:Effective 原则 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接