Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Interfaces in DotNet ganz anders? (https://www.delphipraxis.net/35043-interfaces-dotnet-ganz-anders.html)

Fingolfin 1. Dez 2004 19:33


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:
  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;
Dabei führte das nilen der Interfacereferenz zur Freigabe, es wurde also in diesem Fall das Destroy von TTest aufgerufen.

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:
var
  FTest: TTest;
procedure Irgendwas;
begin
  FTest := TTest.Create;
  FTest.DoSomething;
  FTest.Free;
end;
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.

Kann mich da mal jemand aufklären bitte? Bin sehr verwirrt. :cry:

Vielen Dank schonmal.

Ultimator 1. Dez 2004 19:39

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

sakura 1. Dez 2004 19:41

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:...

Fingolfin 1. Dez 2004 19:47

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:

Fingolfin 1. Dez 2004 19:59

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.

mirage228 1. Dez 2004 20:06

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

Fingolfin 1. Dez 2004 20:14

Re: Interfaces in DotNet ganz anders?
 
Zitat:

Zitat von mirage228
Du könntest versuchen mit

System.GC.Collect();

den Garbage Collector zu zwingen, aufzuräumen. Vielleicht wird Dein Destruktor ja dann aufgerufen.

Danke für den Tipp, aber da regt sich auch nichts. Hier scheint was sehr grundlegend anders als bei Win32 zu laufen. Und ich dachte DotNet mal 2-3 Stunden angucken und gut. ;)

mirage228 2. Dez 2004 05:57

Re: Interfaces in DotNet ganz anders?
 
Zitat:

Zitat von Fingolfin
Zitat:

Zitat von mirage228
Du könntest versuchen mit

System.GC.Collect();

den Garbage Collector zu zwingen, aufzuräumen. Vielleicht wird Dein Destruktor ja dann aufgerufen.

Danke für den Tipp, aber da regt sich auch nichts. Hier scheint was sehr grundlegend anders als bei Win32 zu laufen. Und ich dachte DotNet mal 2-3 Stunden angucken und gut. ;)

Hi,

habe gleich noch einen :mrgreen:

Habe ich in einem anderen Thread gefunden:
Delphi-Quellcode:
GC.WaitforPendingFinalizers();
mit dem Kommentar "wenn es ganz haarig wird" :)

Vielleicht hilft Dir das ja.

mfG
mirage228

merlin17 2. Dez 2004 08:04

Re: Interfaces in DotNet ganz anders?
 
Hallo,

Zitat:

Hier scheint was sehr grundlegend anders als bei Win32 zu laufen. Und ich dachte DotNet mal 2-3 Stunden angucken und gut. Wink
DER war richtig gut, da fängt der Arbeitstag mit einem richtigen Schmunzeln an :spin2:

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....

sakura 2. Dez 2004 17:00

Re: Interfaces in DotNet ganz anders?
 
Ich habe mal ein erstes Tutorial zu diesem Thema verfasst: Der .NET Garbage Collector

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz