gpt4 book ai didi

c# - 在 C# 对象上调用 C++/CLI delete

转载 作者:可可西里 更新时间:2023-11-01 08:37:49 26 4
gpt4 key购买 nike

我正在将一些代码从 C++/CLI 转换为 C#。其中一个对象在 C++/CLI 版本中具有析构函数。一些其他 C++/CLI 代码在使用后对该对象调用“删除”。

我需要在此对象的 C# 版本中实现哪种方法,以便那些“删除”继续发挥相同的作用(IDisposable.Dispose、终结器或我缺少的其他东西)?

最佳答案

我会说 IDisposable如果您需要确定性地处理资源,那么接口(interface)就是您要寻找的。这通常是非托管资源的情况,例如需要关闭的非托管句柄、流或数据库连接。

在 C++/CLI 中,如果声明托管类型(ref class 等),IDisposable 是使用析构函数语法实现的,而 Dispose( ) 通过使用 delete 关键字调用。如果您在本地声明此类托管类型的对象(不使用 ^ 运算符或 gcnew),C++/CLI 甚至会自动调用 Dispose() 当对象超出范围时为您服务。就这点而言,C++/CLI 比 C# 更方便。

使用 C# 时,您将无法对对象调用 delete,您需要手动对其调用 Dispose()。另一种处理 IDisposable 对象的方法是 using堵塞。

终结器(在 C# 中使用析构函数语法实现)与 C++ 析构函数不同,因为它在调用时不确定。具有终结器的对象基本上会排队,直到终结器线程决定调用它们的终结器,因此实际上您永远不知道它何时被调用。

处理非托管资源的最佳方法可能是将两者结合起来。请参阅此处了解推荐方法:
http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx

请注意,但是当使用 IDisposable 时,即使您可以确定性地处理非托管资源,托管对象仍然需要由垃圾收集器收集(非确定性地)。

我刚刚找到一篇解释 C++/CLI 和 C# 之间差异的文章。您可能会发现它很有趣:
http://weblogs.thinktecture.com/cnagel/2006/04/ccli-finalize-and-dispose.html

关于c# - 在 C# 对象上调用 C++/CLI delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com