![]() |
Interfaces in DotNet ganz anders?
Hi, ich arbeite mich gerade mit Delphi 2005 in DotNet ein und mir ist da etwas aufgestoßen.
Früher (in Win32) hat man interfaces üblicherweise ja so verwendet:
Code:
Dabei führte das nilen der Interfacereferenz zur Freigabe, es wurde also in diesem Fall das Destroy von TTest aufgerufen.
ITest = interface
procedure DoSomething; end; TTest = class(TInterfacedObject, ITest) public constructor Create; destructor Destroy; override; procedure DoSomething; end; var FTest: ITest; procedure InterfaceErzeugen; begin FTest := TTest.Create; FTest.DoSomething; end; procedure Interfacefreigeben; begin FTest := nil; end; Unter Delphi 2005 passiert das nicht. Das nilen nilt zwar die Interface-Referenz, der Destructor wird aber überhaupt nicht berührt. Ich habe jetzt schon Sachen wie
Code:
getestet und die haben anscheinend ohne Probleme funktioniert. Dabei ist doch gerade die Mischung von Object- und Interfacereferenzen das absolut böse "ohoh" in Delphi Win32.
var
FTest: TTest; procedure Irgendwas; begin FTest := TTest.Create; FTest.DoSomething; FTest.Free; end; Kann mich da mal jemand aufklären bitte? Bin sehr verwirrt. :cry: Vielen Dank schonmal. |
Re: Interfaces in DotNet ganz anders?
Ich hab mal was gelesen, dass das mit dem free'en was mit der Garbage Collection zu tun hat
|
Re: Interfaces in DotNet ganz anders?
Interfaces werden unter .NET durch den Garbage Collector verwaltet. Dieser räumt nur in unregelmäßigen Intervallen auf. D.h. Du kannst den Zeitpunkt nicht mehr direkt bestimmen. Muss wohl mal ein Tutorial her :mrgreen:
...:cat:... |
Re: Interfaces in DotNet ganz anders?
Hmm, es ist ja nicht so, daß ich davon noch nicht gehört hätte. Aber wenn dem so wäre müßte der Garbage Collector doch spätestens collecten, wenn die Applikation geschlossen wird. Da passiert aber gar nix.
Waaah, wie soll ich nur programmieren, wenn ich noch nicht mal Code bei der Freigabe eines Objektes ausführen kann? :wall: :cry: |
Re: Interfaces in DotNet ganz anders?
Nachtrag:
Nochmal von der anderen Seite. Normale Objekte kann ich doch auch explizit freigeben (Destroy, Disposable usw.). Das ist doch auch definitiv wichtig, wenn die z.B. die Freigabe eines Objekts andere Objekte über dessen Tod benachrichtigen soll (Bsp.: Katze, du brauchst keine Mäuse mehr jagen, die sind alle am Rattengift gestorben). Ich kann mir einfach nicht vorstellen, daß Interfaces hier derart aus der Rolle fallen. Das würde ihren Wert doch massiv schmälern. Vielleicht ist mein zweiter Ansatz (Mischung von Objekt- und Interfacereferenzen) doch naheliegender. Kann es sein, daß eine solche Herangehensweise jetzt erzwungen wird? Hmm, vielleicht kann ja noch jemand Licht in das Dunkel bringen. Auf jeden Fall schonmal vielen Dank. |
Re: Interfaces in DotNet ganz anders?
Du könntest versuchen mit
System.GC.Collect(); den Garbage Collector zu zwingen, aufzuräumen. Vielleicht wird Dein Destruktor ja dann aufgerufen. mfG mirage228 |
Re: Interfaces in DotNet ganz anders?
Zitat:
|
Re: Interfaces in DotNet ganz anders?
Zitat:
habe gleich noch einen :mrgreen: Habe ich in einem anderen Thread gefunden:
Delphi-Quellcode:
mit dem Kommentar "wenn es ganz haarig wird" :)
GC.WaitforPendingFinalizers();
Vielleicht hilft Dir das ja. mfG mirage228 |
Re: Interfaces in DotNet ganz anders?
Hallo,
Zitat:
Ich habe das erstemal am 17.05.2001 (musste ich im Regal jetzt ganz schnell suchen) mit .net zu tun gehabt und schon dort war klar: mit den .net E-Businesslösungen (so hies damals das 1st-Training) ist alles neu.... ohne Altlasten.... :-) thomas Sorry, normal bin ich nicht so schnell OT, aber hier kann ich es mir nicht verkneifen.... |
Re: Interfaces in DotNet ganz anders?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz