gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:53:35 25 4
gpt4 key购买 nike

我是一名 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/

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