AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie String auf "Leer" prüfen?

Ein Thema von TiGü · begonnen am 11. Jul 2012 · letzter Beitrag vom 12. Jul 2012
Antwort Antwort
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wie String auf "Leer" prüfen?

  Alt 11. Jul 2012, 15:05
Warum nochmal war es besser einen String auf Leerheit zu prüfen indem man folgendes tut:
Delphi-Quellcode:
// Variante 1
var
  teststr : string
  IsNoEmptyString : Boolean;
begin
  IsNoEmptyString := teststr <> '';
end;
anstatt das:
Delphi-Quellcode:
// Variante 2
var
  teststr : string
  IsNoEmptyString : Boolean;
begin
  IsNoEmptyString := Length(teststr) > 0;
end;
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 ).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie String auf "Leer" prüfen?

  Alt 11. Jul 2012, 15:08
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?
$2B or not $2B
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Wie String auf "Leer" prüfen?

  Alt 11. Jul 2012, 23:52
Ist Length() nicht via Compilermagic implementiert, und testet bei langen Strings letztlich auch nur auf (quasi) Integer(@MyString[1] - SizeOf(Integer))=0 ? (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.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Wie String auf "Leer" prüfen?

  Alt 12. Jul 2012, 00:44
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wie String auf "Leer" prüfen?

  Alt 12. Jul 2012, 01:01
Der Grund ist einfach:

Length als Pascal sieht etwa so aus.

Delphi-Quellcode:
funtion Length(str: string): Integer; inline;
begin
  if Pointer(str) = nil then
    Exit(0);
  Result := (PNativeInt(str) - 1)^;
end;
Und dann wird das nochmals mit 0 verglichen.

Dagegen ist die reine Prüfung auf nil natürlich kleiner, da diese Prüfung auch nochmals im Length enthalten ist.
$2B or not $2B
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Wie String auf "Leer" prüfen?

  Alt 12. Jul 2012, 09:56
Wieder wat gelernt!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Wie String auf "Leer" prüfen?

  Alt 12. Jul 2012, 10:08
Kleinigkeit:
 IsNoEmptyString Ist später vermutlich sehr schlecht zu lesen... If NOT IsNoEmptyString.... Man benötigt schon ein paar Sekunden, um beim Lesen des Codes die doppelte Negation aufzulösen.

Der Bezeichner sollte 'eigentlich' nie eine Negation im Namen beinhalten, einfach aus Gründen der besseren Lesbarkeit.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Wie String auf "Leer" prüfen?

  Alt 12. Jul 2012, 11:37
Kleinigkeit:
 IsNoEmptyString Ist später vermutlich sehr schlecht zu lesen... If NOT IsNoEmptyString.... Man benötigt schon ein paar Sekunden, um beim Lesen des Codes die doppelte Negation aufzulösen.

Der Bezeichner sollte 'eigentlich' nie eine Negation im Namen beinhalten, einfach aus Gründen der besseren Lesbarkeit.
Andererseits ist in der Regel ein gefüllter String erforderlich.
Also die Abfrage auf str <> '' ist häufiger als str = '' .
Sonst müsste man immer schreiben if not IsEmptyString then anstatt if IsNoEmptyString then .

Ein Clean-Code-Dilemma.

EDIT: Ach ja, danke an himitsu und NamenLozer für die einleuchtende Erklärung.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Wie String auf "Leer" prüfen?

  Alt 12. Jul 2012, 11:51
Ein Clean-Code-Dilemma.
Dann nenn es nicht Empty Leer, sondern Voll/Gefüllt.
$2B or not $2B
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Wie String auf "Leer" prüfen?

  Alt 12. Jul 2012, 13:08
Ein Clean-Code-Dilemma.
Dann nenn es nicht Empty Leer, sondern Voll/Gefüllt.
Manchmal ist man aber auch wie vernagelt...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz