![]() |
Wie String auf "Leer" prüfen?
Warum nochmal war es besser einen String auf Leerheit zu prüfen indem man folgendes tut:
Delphi-Quellcode:
anstatt das:
// Variante 1
var teststr : string IsNoEmptyString : Boolean; begin IsNoEmptyString := teststr <> ''; end;
Delphi-Quellcode:
Ich hatte irgendwo und irgendwann mal im Forum die Begründung dafür gelesen, aber aufgrund der zu verwendenen Begrifflichkeiten findet sie Forumssuche nichts (oder ich :) ).
// Variante 2
var teststr : string IsNoEmptyString : Boolean; begin IsNoEmptyString := Length(teststr) > 0; end; |
AW: Wie String auf "Leer" prüfen?
Wenn du es nicht tausende Male die Sekunde machst, isses vollkommen egal, was man verwendet, auch wenn ich <>'' und ='' übersichlticher finde.
Length ist eine Funktion und diese muß aufgerufen werden Sprünge im Code. Da der "String"/AnsiString/WideString/UnicodeString intern ein Pointer ist und ein Leer-String einem nil entspricht, prüft ='' und <>'' ganz einfach nur auf nil. Aber warum schaust du nicht einfach mal nach, was beim Debuggen in der CPU-Ansicht steht? |
AW: Wie String auf "Leer" prüfen?
Ist Length() nicht via Compilermagic implementiert, und testet bei langen Strings letztlich auch nur auf (quasi)
Delphi-Quellcode:
? (Ich habs mangels Delphi auf Privat-PC nicht nachgesehen, aber mir war so und es würde Sinn machen. Zumindest solange leere lange Strings alloziert sind und den versteckten Längenzähler auch wirklich haben.)
Integer(@MyString[1] - SizeOf(Integer))=0
|
AW: Wie String auf "Leer" prüfen?
Die erste Variante erzeugt effizienteren OP-Code:
Code:
Project1.dpr.13: a := s = '';
00409165 833D20E2400000 cmp dword ptr [$0040e220],$00 0040916C 0F94C2 setz dl Project1.dpr.14: b := Length(s) = 0; 0040916F A120E24000 mov eax,[$0040e220] 00409174 85C0 test eax,eax 00409176 7405 jz $0040917d 00409178 83E804 sub eax,$04 0040917B 8B00 mov eax,[eax] 0040917D 85C0 test eax,eax 0040917F 0F94C3 setz bl |
AW: Wie String auf "Leer" prüfen?
Der Grund ist einfach:
Length als Pascal sieht etwa so aus.
Delphi-Quellcode:
Und dann wird das nochmals mit 0 verglichen.
funtion Length(str: string): Integer; inline;
begin if Pointer(str) = nil then Exit(0); Result := (PNativeInt(str) - 1)^; end; Dagegen ist die reine Prüfung auf nil natürlich kleiner, da diese Prüfung auch nochmals im Length enthalten ist. |
AW: Wie String auf "Leer" prüfen?
Wieder wat gelernt! :thumb:
|
AW: Wie String auf "Leer" prüfen?
Kleinigkeit:
Delphi-Quellcode:
Ist später vermutlich sehr schlecht zu lesen...
IsNoEmptyString
Delphi-Quellcode:
Man benötigt schon ein paar Sekunden, um beim Lesen des Codes die doppelte Negation aufzulösen.
If NOT IsNoEmptyString....
Der Bezeichner sollte 'eigentlich' nie eine Negation im Namen beinhalten, einfach aus Gründen der besseren Lesbarkeit. |
AW: Wie String auf "Leer" prüfen?
Zitat:
Also die Abfrage auf
Delphi-Quellcode:
ist häufiger als
str <> ''
Delphi-Quellcode:
.
str = ''
Sonst müsste man immer schreiben
Delphi-Quellcode:
anstatt
if not IsEmptyString then
Delphi-Quellcode:
.
if IsNoEmptyString then
Ein Clean-Code-Dilemma. EDIT: Ach ja, danke an himitsu und NamenLozer für die einleuchtende Erklärung. |
AW: Wie String auf "Leer" prüfen?
Zitat:
|
AW: Wie String auf "Leer" prüfen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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