Interfaces im Windows .NET Framework
Abgesehen vom Namen und der Idee (Definition, aber nicht Implementierung) und der Syntax haben die .NET Interfaces mit den Delphi für
Win32 Interfaces nicht mehr viel gemeinsam.
Das Referenz-Counting der Interfaces wird vollständig von Delphis Schultern genommen und durch das Referenz-Counting von .NET übernommen. Der erste sehr große Vorteil ist: Objekte und Interfaces dieser Objekte werden gemeinsam gezählt. Kurz gesagt: obiger Code, welcher in
Win32 zu einer
AV führen kann, funktioniert unter .NET einwandfrei.
In .NET übernehmen Objekte die Referenzzählung nicht mehr selbständig, wie es unter
Win32 nötig war. In .NET wird diese durch den .NET eigenen Garbage Collector (GC) übernommen. Die genauen Interna des GC werde ich zu späterer Zeit, in einem anderen Tutorial, erläutern. Momentan soll ein kurzer Auszug reichen.
Wird unter .NET die Instanz einer Klasse erstellt (z.B.
TObject.Create;), also ein Objekt, so erfolgt das in der
Intermediate Language (
IL, der .NET Bytecode) durch einen Aufruf zu
newobj.
newobj berechnet dann die Menge an Speicher, welche durch das neue Objekt benötigt wird. Anschließend wird die Menge an Speicher hinzugefügt, die .NET zur Verwaltung des Objektes (Overhead) benötigt. Je nach System sind das zur Zeit 8 Bytes (32 Bit-Systeme) oder 16 Bytes (64 Bit-Systeme). .NET nutzt ein internes Referenz-Counting. Es ist natürlich intern etwas komplizierter als hier dargestellt, aber das soll für dieses Tutorial genügen.
Wird eine Referenz auf ein Objekt oder ein Interface gelöscht (oder überschrieben), so wird der Referenzzähler des Objektes, bzw. des Objektes welches das Interface implementiert, um eins verringert.
Hier liegt der Unterschied, unter Delphi für
Win32 hat das Objekt nur für Interfaces intern einen eigenen Refernz-Counter genutzt. In .NET verwaltet das System selbst einen Referenz-Counter für das Objekt, unabhängig ob auf dieses direkt oder über ein Interface zugegriffen wird.