Hauptsächlich aus historischen Gründen. FillChar() stammt noch aus der Zeit von Turbo Pascal und wurde für solche Zwecke verwendet. Der Name ist eigentlich ein wenig irreführend, denn obwohl er Fill Char (), es ist wirklich Fill Byte (). Der Grund dafür ist, dass der letzte Parameter ein char annehmen kann ou ein Byte. FillChar(Foo, SizeOf(Foo), #0) und FillChar(Foo, SizeOf(Foo), 0) sind also gleichwertig. Eine weitere Quelle der Verwirrung ist, dass FillChar seit Delphi 2009 nur noch Bytes füllt, obwohl Char äquivalent zu WideChar ist. Als wir uns die häufigsten Verwendungen von FillChar ansahen, um herauszufinden, ob die meisten Leute FillChar verwenden, um den Speicher tatsächlich mit Zeichendaten zu füllen, oder ob sie es nur verwenden, um den Speicher mit einem bestimmten Byte-Wert zu initialisieren, stellten wir fest, dass der letztere Fall die Verwendung dominiert und nicht der erstere. Daher haben wir beschlossen, FillChar byte-zentriert zu halten.
Es stimmt, dass das Löschen eines Datensatzes mit FillChar, der ein Feld enthält, das mit einem der "verwalteten" Typen (Strings, Variant, Interface, dynamische Arrays) deklariert wurde, unsicher sein kann, wenn es nicht im richtigen Kontext verwendet wird. In dem von Ihnen angeführten Beispiel ist es jedoch tatsächlich sicher, FillChar für die lokal deklarierte Datensatzvariable solange es das erste ist, was Sie innerhalb dieses Rahmens an der Aufzeichnung tun . Der Grund dafür ist, dass der Compiler Code zur Initialisierung des String-Feldes im Datensatz erzeugt hat. Dadurch wird das String-Feld bereits auf 0 (null) gesetzt. Der Aufruf von FillChar(Foo, SizeOf(Foo), 0) überschreibt einfach den gesamten Datensatz mit 0 Bytes, einschließlich des String-Feldes, das bereits 0 ist. Die Verwendung von FillChar für die Datensatzvariable nach dem Stringfeld ein Wert zugewiesen wurde, wird nicht empfohlen. Die Verwendung der Technik der initialisierten Konstanten ist eine sehr gute Lösung für dieses Problem, da der Compiler den richtigen Code erzeugen kann, um sicherzustellen, dass die vorhandenen Datensatzwerte während der Zuweisung ordnungsgemäß abgeschlossen werden.