【推荐阅读:Using a Custom Actio】
c++编程人员容易犯的10个c#错误我们知道, c#的语法与c++非常相似,实现从c++向c#的转变,其困难不在于语言本身,而在于熟悉.net的可管理环境与对.net框架的理解. 尽管c#与c++在语法上的变化是很小的,几乎不会对我们有什么影响,但有些变化却足以使一些粗心的c++编程人员时刻铭记在心.在本篇文章中我们将讨论c++编程人员最容易犯的十个错误. 陷阱1: 没有明确的结束方法 几 乎可以完全肯定地说,对于大多数c++编程人员而言,c#与c++最大的不同之处就在于碎片收集.这也意味着编程人员再也无需担心内存泄露与确保删除所有 没有用的指针.但我们再也无法精确地控制杀死无用的对象这个过程.事实上,在c#中没有明确的destructor. 如果使用非可管理性资源,在不使用这些资源后,必须明确地释放它.对资源的隐性控制是由finalize方法(也被称为finalizer)提供的,当对象被销毁时,它就会被碎片收集程序调用收回对象所占用的资源. finalizer 应该只释放被销毁对象占用的非可管理性资源,而不应牵涉到其他对象.如果在程序中只使用了可管理性资源,那就无需也不应当执行finalize方法,只有 在非可管理性资源的处理中才会用到finalize方法.由于finalizer需要占用一定的资源,因此应当只在需要它的方法中执行 finalizer. 直接调用一个对象的finalize方法是绝对不允许的(除非是在子类的finalize中调用基础类的finalize.),碎片收集程序会自动地调用finalize. 从语法上看,c#中的destructor与c++非常相似,但其实它们是完全不同的.c#中的destructor只是定义finalize方法的捷径.因此,下面的二段代码是有区别的: ~myclass(){// 需要完成的任务}myclass.finalize(){// 需要完成的任务base.finalize();}
错误2:finalize与dispose使用谁? 从上面的论述中我们已经很清楚,显性地调用finalizer是不允许的,它只能被碎
片收集程序调用.如果希望尽快地释放一些不再使用的数量有限的非可管理性资源(如文件句柄),则应该使用idisposable界面,这一界面有个
dispose方法,它能够帮你完成这个任务.dispose是无需等待finalize被调用而能够释放非可管理性资源的方法. 如
果已经使用了dispose方法,则应当阻止碎片收集程序再对相应的对象执行finalize方法.为此,需要调用静态方法
gc.suppressfinalize,并将相应对象的指针传递给它作为参数,finalize方法就能调用dispose方法了.... 下一页