Das Erstaunliche an diesem bugTeaser ist wohl vorallem der Umstand, dass der durchschnittliche C++-Programmierer den Fehler leicht entdeckt, während sich selbst gestandene Delphi-Profis verwundert am Kopf kratzen und nichts Anrüchiges entdecken können. Denn der Fehler ist so offensichtlich wie einfach zu beheben und kann am besten mit folgendem xUnit4Delphi-Testfall illustriert werden:
procedure TAssignTests.TestSelfAssign;
var
Items: TStrings;
const
sLine1 = 'Line 1';
sLine2 = 'Line 2';
sLine3 = 'Line 3';
begin
Items := TStringList.Create;
try
Items.Add(sLine1);
Items.Add(sLine2);
Items.Add(sLine3);
Items.Assign(Items);
AssertEquals('Wrong number of elements after self assign',3,Items.Count);
finally
Items.Free;
end;
end;
Dieser Test wird schief gehen, da nach der Selbstzuweisung des StringList-Objekts dieses nicht die erwarteten drei Elemente enthält sondern leer ist. Der Grund dafür ist einfach: die Implementierung der Assign-Methode lässt die Möglichkeit der Selbstzuweisung schlicht ausser Acht und löscht unbesehen den Inhalt der Liste vor der Übernahme der Werte aus der neuen Liste. Was fehlt, ist eine Prüfung, ob es sich bei der übergebenen Liste das eigene Objekt handelt: