Ja, aber nur, wenn das Array verwaltete Typen enthält.
Sehen Sie sich das folgende Codebeispiel an.
procedure TForm1.Button1Click(Sender: TObject);
var
sa: array[0..19] of string;
i: Integer;
begin
for i := 0 to 5 do
sa[i]:= 'test'+IntToStr(i);
for i := 6 to High(sa) do begin
if sa[i] <> '' then ShowMessage('oops'); //will never be triggered.
end;
end;
Beachten Sie, dass die leere Zeichenfolge aka ''
eine gültige Zeichenfolge ist. Wenn Sie zulassen, dass das Programm leere Zeichenfolgen in diesem Array speichert, schlägt Ihr Schema fehl. Wenn dies der Fall ist, müssen Sie das Array mit einer Platzhalterzeichenfolge initialisieren.
Managed-Typen sind leer initialisiert
Wenn Sie diese Probe debuggen und die CPU-Fenster zu öffnen, werden Sie die folgende Initialisierungscode sehen:
Unit1.pas.30: begin
005C9B24 55 push ebp
005C9B25 8BEC mov ebp,esp
......
005C9B3F E8F811E4FF call @InitializeArray
......
Unit1.pas.31: for i := 0 to 5 do
In der begin
Anweisung ein Aufruf gemacht wird InitializeArray
, da das Array string
enthält.
If the array contains: string
, interface
, dynamic array
, variant
or anonymous method
(or records containing any of these) then it will be initialized.
Nicht verwaltete Typen sind nicht
Wenn das Array enthält etwas anderes wird es nicht initialisiert werden initialisiert; was bedeutet, dass es alles enthalten wird, was vorher in diesem Teil der Erinnerung war.
procedure TForm1.Button1Click(Sender: TObject);
var
sa: array[0..19] of integer;
i: Integer;
begin
for i := 0 to 5 do
sa[i]:= i+1;
for i := 6 to High(sa) do begin
//will most likely be triggered
if sa[i] <> 0 then ShowMessage('no init for integer');
end;
end;
(Offensichtlich ein **dynamic** array
(ein Array ohne vorgegebene Grenzen wird) vor der Verwendung auf Null gesetzt werden und bei der Erweiterung)
Dies nicht zu den Teilnehmern gilt
Alle Mitglieder (auch bekannt als Felder) einer Klasse werden auf Null initialisiert, wenn ein Objekt (Instanz dieser Klasse) erstellt wird.
Global variables are also zero initialized. Variablen lokal zu einer Methode sind nicht.
Clever Programmierung
Wenn Sie irgendwie eine feste Länge Array zu verwenden sind gezwungen, eine variable Anzahl von Strings zu speichern, ist es verschwenderisch die Anzahl der Elemente zu zählen, durch die Anordnung durchquert.
Viel besser, einen Zähler zu haben, der die Anzahl der Elemente verfolgt.
type
TNames = record
count: integer;
items: array[0..20] of string;
end;
Sonst fallen Sie in eine Schlemiel the painter Falle; ein bekanntes Antipattern.
Warum verwenden Sie kein dynamisches Array? Dann würdest du es wissen, indem du length (arrName) verwendest ... –
Es ist für eine Schuletätigkeit ... und sie bestehen darauf, dass ich diese –
benutze, dann iteriere das Array und zähle ... –