微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在将一些代码从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

原文地址:https://www.jb51.cc/csharp/95670.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐