![]() |
AW: Properties haben nach Zuweisung falsche Werte
@Der schöne Günther: Dein Code ist eine gute Zusammenfassung und zeigt mit Delphi 2010 den Fehler. Stellt das jemand bitte in den QC ein? Ich kann mich seit 20 Minuten nicht einloggen... Danke!
|
AW: Properties haben nach Zuweisung falsche Werte
Zitat:
|
AW: Properties haben nach Zuweisung falsche Werte
Das Ungewöhnliche ist wohl das hier:
Delphi-Quellcode:
Die Zuweisung von 'a' und 'b' im 'Getter' der ReAdr.
function TForm1.GetReAdr: TAdresse;
begin Adresse.Vorname := 'a'; Adresse.Name := 'b'; Result := Adresse; end; Man würde die Eigenschaften der Adresse einmalig setzen z.B. per LazyLoad. Oder man würde gleich eine protected Property aus der Adresse machen. |
AW: Properties haben nach Zuweisung falsche Werte
Zitat:
Auch wenn es in dem Fall OK ist, wenn "Name" als Property verwendet wird. Ich würde diese Bezeichnung nicht verwenden. Habe früher schon oft nach Fehlern gesucht, weil "Name" dann doch häufiger in Klassen verwendet wird. Ich verwende für So etwas immer "Vorname" und "Nachname". Das ist dann eindeutiger. Aber natürlich Geschmackssache. |
AW: Properties haben nach Zuweisung falsche Werte
Zitat:
|
AW: Properties haben nach Zuweisung falsche Werte
Lazy Load sorgt dafür, das solche Zuweisungen nur einmal durchgeführt werden.
Delphi-Quellcode:
Allgemein ist das LazyLoad-Pattern für Properties so:
// Also so gehts:
Function TForm1.GetReAdr: TAdresse; Begin If fAddress = Nil Then Begin Adresse.Vorname := 'a'; Adresse.Name := 'b'; fAddress := Adresse; End; Result := fAddress; End; // Und so auch Function TForm1.GetReAdr: TAdresse; Begin If not fInitialized Then Begin Adresse.Vorname := 'a'; Adresse.Name := 'b'; fInitialized := True; End; Result := Adresse; End;
Delphi-Quellcode:
Damit wird nur beim Zugriff, und dann nur beim ersten, instantiiert. Früher nannte man das 'Fetch on demand'. Heute eben 'lazy load'. Und damit schlägt man dem blöden Compiler ein Schnippchen.
Function TMyClass.GetProperty : TSomeValue;
Begin if fProperty=nil then fProperty := CreateSomeValue; result := fProperty; End; |
AW: Properties haben nach Zuweisung falsche Werte
Wie gesagt LazyLoad wird verwendet (siehe Post #6) und ändert am Problem nichts...
|
AW: Properties haben nach Zuweisung falsche Werte
Das Problem ist die Referenz-Zählung für die Strings. Bei jeder Zuweisung wird der String an eine andere Speicheradresse geschrieben und die alte Speicheradresse wird als frei markiert.
Es taucht nicht auf, wenn man für die Eigenschaften
Delphi-Quellcode:
und
Name
Delphi-Quellcode:
einen Getter benutzt
Vorname
Delphi-Quellcode:
Weiterhin taucht es nicht auf, wenn man die Adresse so zusammensetzt
type
TAdresse = class private FVorname: string; FName: string; function GetName: string; function GetVorname: string; public property Vorname: string read GetVorname write FVorname; property Name: string read GetName write FName; end;
Delphi-Quellcode:
Und wenn man sich mal spasseshalber die Pointer auf die Variablen holt
function TFoo.GetFullName : string;
begin Result := GetAdresse.Vorname + GetAdresse.Nachname; end;
Delphi-Quellcode:
Dieses ist aber eher Zufall, da die beiden Speicherstellen abwechselnd belegt werden, was wir mit folgendem Code überprüfen können
function TTest.GetFullName : string;
var LVorname, LName : PChar; begin LVorname := PChar( GetAdresse.Vorname ); // jetzt zeigt der Debugger den korrekten Vornamen bei LVorname an LName := PChar( GetAdresse.Name ); // ab jetzt steht in LVorname und LName der gleiche Wert, weil nun die Pointer an die gleiche Stelle zeigen Result := GetAdresse.Vorname + GetAdresse.Nachname; end;
Delphi-Quellcode:
Hier die Inhalte jeweils nach der Codezeile
function TTest.GetFullName: string;
var LName1, LVorname, LName2 : PChar; begin {1} LName1 := PChar( GetAdresse.Name ); {2} LVorname := PChar( GetAdresse.Vorname ); {3} LName2 := PChar( GetAdresse.Name ); end;
Delphi-Quellcode:
natürlich einwandfrei funktioniert. Warum?
function TTest.GetFullNameReverse: string;
begin Result := GetAdresse.Name + ' ' + GetAdresse.Vorname; end;
|
AW: Properties haben nach Zuweisung falsche Werte
Zitat:
@Sir Rufo: Nee, oder? Verrückt! Tolle Analyse! Gut, das ich bei C# bin. :mrgreen: |
AW: Properties haben nach Zuweisung falsche Werte
Unter Win64 ist der Pointer-Reigen auch zu beobachten, allerdings sind die Ergebnisse immer korrekt.
Somit wird unter Win64 wohl der Speicherbereich sofort kopiert und bei Win32 wird sich der Pointer gemerkt und zum Schluss zusammenkopiert (mit dem bekannten Ergebnis). Nur so eine Vermutung und ich will da jetzt auch nicht zu sehr in die Tiefe gehen :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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 by Thomas Breitkreuz