2016-05-11 4 views
2

Ich frage mich, ob die Länge des Arrays von Delphi auf 0 nach der Verwendung ist eine korrekte Praxis oder nicht.Sollte die Länge des Arrays nach der Verwendung auf Null gesetzt werden?

var 
    MyArray : array of TObject; 
begin 
    SetLength(MyArray, N); 
    // do something with MyArray (add items and use it..) 
    SetLength(MyArray, 0); 
end; 

Gibt es einen Grund, warum ich die Länge auf 0 setzen sollte?

Antwort

6

Unter der Annahme, dass eine lokale Variable ist, gibt es keinen Grund, die Variable im angezeigten Code zu finalisieren. Sobald die Variable den Umfang verlässt, wird sie abgeschlossen. Daraus kann nichts gewonnen werden.

Manchmal haben Sie jedoch eine Variable, deren Gültigkeitsbereich wesentlich länger ist als die Verwendung des Arrays. In diesen Szenarien kann es nützlich sein, die Variable zu finalisieren, sobald Sie damit fertig sind, damit der Speicher zurückgegeben wird.

Persönlich würde ich

MyArray := nil; 

oder

Finalize(MyArray); 

bevorzugen, die meiner Meinung nach leichter als Abschluss Aussagen herausspringen. Ihr

kann aussehen, als würden Sie beim Überfliegen des Codes zuordnen.

2

Dynamische Arrays werden automatisch freigegeben, wenn nichts darauf verweist.

Ich würde die folgende Methode bevorzugen, wenn Sie dies manuell tun müssen. Das sieht für mich klar aus als andere Methoden.

MyDynamicArray = nil; 

Er legt die natürliche Umgebung der Nullreferenz fest und lässt den Speichermanager zu gegebener Zeit freigeben.

+0

Ich denke, es ist ein bisschen stark zu erklären, dass dieser Weg der "Beste" ist. Können Sie zumindest begründen, warum es "besser" ist als die beiden Alternativen? –

+1

Ich habe meine Antwort nicht wirklich mit deiner verglichen. Dynamische Arrays werden verwaltet und würden freigegeben, wenn sie nicht referenziert werden. Wenn Sie jetzt nil auf den Zeiger setzen, nehmen Sie die Referenz manuell ab (vorausgesetzt, dass es keine andere Referenz gibt). Deshalb dachte ich, es wäre das Beste, die natürliche Umgebung für den Managementprozess festzulegen, um darauf zu reagieren. –

+0

@DavidHeffernan ist es expliziter, was Sie vorhaben zu tun, es vermittelt die Semantik, nicht die Implementierung. Außerhalb dieser Überlegung ist SetLength-0 natürlich das Gleiche. –

Verwandte Themen