加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#对象上调用C/C++LI删除

发布时间:2020-12-15 06:25:02 所属栏目:百科 来源:网络整理
导读:我正在将一些代码从C/C++LI转换为C#.其中一个对象在C/C++LI版本中具有析构函数.一些其他C/C++LI代码在使用后调用“删除”对象. 我需要在C#版本的对象中实现哪种方法,这样“删除”继续运行(IDisposable.Dispose,finalizer或者其他我所缺少的东西)? 解决方法
我正在将一些代码从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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读