我是一名Delphi程序员,现在正在尝试使用C#进行编程。请问C#中的接口和Delphi中的接口是否相同,即在接口离开作用域时,无需担心释放其内存?
function TInterfacedObject._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
对于程序员来说,它们看起来是一样的。使用和遗忘。
内部工作方式不同,在.NET中,接口是(仅仅是)被垃圾回收器扫描的另一个引用。
在Delphi中,接口是一种特殊类型的引用,它们是引用计数的(一种不同的内存管理技术)。
.NET/Delphi的主要区别在于,在.NET中,所有引用(接口、对象和数组)都是由垃圾回收器进行回收的。
我认为它并不会在作用域外被释放,而是在垃圾回收发生时(即当它们不再被使用时)进行释放。
C# 中的所有内容都是垃圾回收的,因此您不需要手动释放它们。
但是有一些显著的区别。Delphi 接口是引用计数的,而 C# 接口是垃圾回收的。C# 支持多接口继承。
interface IFoo : IBar, IDisposable
是可以的,但是当你反射它回来时,实现IFoo接口的类可能会显示出三个不相关的接口。 - H HIFoo f = ...; Ibar b = f;
每个 IFoo 都是一个 IBar。替换原则在起作用。 - H HCLR 处理内存管理。垃圾回收是 CLR 中的内在服务。
您不需要将变量或字段置空以便通过垃圾回收来收集对象。
您不需要实现或使用 IDisposable 来清理内存。Dispose 方法对于释放内存中的托管对象没有任何作用。Dispose 方法应该用于释放“非托管”资源,包括数据库连接、位图或任何您可能持有的非托管结构。
如果您谈论的是视觉组件(如窗体、对话框等)中的接口,则会变得更加混乱。在 WinForms 中,我相信当一个接口(可视化)不再可见时,它将被清理并进行垃圾回收。当需要时,窗体将重新创建。在 WPF 中,Windows 和 Pages 不会立即销毁。它们会被缓存到应用程序的生命周期结束,除非应用程序开发人员明确清理它们。这提高了 WPF 应用程序的性能,但也增加了您必须关注应用程序资源的额外负担。
垃圾回收是一个完全独立的主题。从物理内存中实际释放托管对象是在此处完成的,完全由垃圾回收服务控制,您通常不必担心其工作原理。
干杯