c# - Delphi 接口(interface)和 C# 接口(interface)在内存使用(清理等)方面有什么区别

标签 c# delphi interface

我是一名 Delphi 程序员,正在尝试在这里使用 C# 完成一些工作。 C# 中的接口(interface)是否以与 Delphi 中相同的方式工作 - 您无需担心释放它,因为它在超出范围时会被释放。

最佳答案

Delphi 和 .NET 在此领域(特别是与接口(interface)相关)的主要区别在于清理的不确定性。

在 Delphi 中,所有接口(interface)的使用都遵循 COM 模型。也就是说,它是引用计数的。如果该类实现引用计数生命周期管理模型,则当引用计数降至零时,对象实例将在该点被销毁。

注意:生命周期管理是类实现的一项功能。要最清楚地看到这一点,请查看 TInterfacedObjectIUnknown.Release 的实现:

function TInterfacedObject._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;

如果 Release 的实现没有调用 Destroy,那么当引用计数降为零时对象不会被销毁并且仍然必须显式释放' d 通过一些对象对对象的引用。这可以在 Delphi 中用于创建实现接口(interface)但不受自动引用计数生命周期管理的对象(尽管您无法避免编译器注入(inject)的引用计数代码,即调用 AddRef发布)。

首先在 .NET 中没有引用计数本身。垃圾收集器的工作方式要复杂得多,其细节与本讨论没有直接关系。

关键的区别在于,当一个对象不再被使用时(但是这超出了简单的引用计数的范围),这不是它在 .NET 中被销毁的时间点。

事实上,从理论上讲,未使用的对象可能会在您的应用程序中累积,直到您的进程生命周期的很晚 - 特别是在空闲周期很少的计算密集型应用程序中。在 .NET 中,您无法准确地确定何时那些未使用的对象最终会被释放。

有些人会争辩说这是一件好事,尽管它混淆了清理对象被销毁时锁定或拥有的资源的通常做法,因为您通常需要释放那些锁定/拥有的资源比等待垃圾收集器更紧急。这就是 IDisposable 在 .NET 中发挥作用的地方,其细节同样不直接相关,您可以在闲暇时进一步研究。

关于c# - Delphi 接口(interface)和 C# 接口(interface)在内存使用(清理等)方面有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3097338/

相关文章:

c# - 找不到路径 '/Views/Shared/Error.cshtml'

forms - 模态表格不会关闭

delphi - 当相关类在编译和链接时存在并且在代码中显式存在时,运行时引发的 EClassNotFound 真正意味着什么?

C# 接口(interface)类和对象依赖关系和设计问题(代码分离)

c# - 是否可以编辑打开的Excel文件

c# - 将对象动态转换为正确的子类

c# - const 在这里表示什么?

delphi - 修改VCL组件代码

c# - 在同一台机器上托管的 C# 和 Python 应用程序之间的通信

c# - 无效参数 - 继承的接口(interface)有效,但隐式转换则不然。是什么赋予了?