我正在将一些代码从C/C++LI转换为C#.其中一个对象在C/C++LI版本中具有析构函数.一些其他C/C++LI代码在使用后调用“删除”对象.
我需要在C#版本的对象中实现哪种方法,这样“删除”继续运行(IDisposable.Dispose,finalizer或者其他我所缺少的东西)?
解决方法
如果您需要确定性的资源处理,我会说
IDisposable
界面是您寻找的内容.这通常是非托管资源的情况,例如需要关闭的非托管句柄,流或数据库连接.
在C/C++LI中,如果声明受管类型(ref类等),则使用析构函数语法实现IDisposable,并使用delete关键字调用Dispose().如果您在本地声明托管类型的对象(不使用^ operator或gcnew),则当对象超出范围时,C/C++LI甚至会自动为您调用Dispose().这样,C/C++LI比C#更方便.
在使用C#时,您将无法在对象上调用delete,而需要手动调用Dispose().处理IDisposable对象的另一种方法是using
块.
终结器(通过使用析构函数语法在C#中实现)与C析构函数不同,因为它将被调用时不是确定性的.具有终结器的对象基本上排队等待,直到终结者线程决定调用他们的终结器,所以有效地你永远不会知道什么时候被调用.
处理非托管资源的最佳方法可能是两者的组合.看到这里推荐的方法:
http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx
但是请注意,使用IDisposable时,即使可以确定性地处理非托管资源,管理对象仍然需要由垃圾收集器收集(非确定性).
我刚刚发现一篇文章解释了C/C++LI和C#之间的区别.你可能会觉得有趣:
http://weblogs.thinktecture.com/cnagel/2006/04/ccli-finalize-and-dispose.html