Hauptseite >Tips zu VB5/6 > Leerer String vs. vbNullString | |
Zitat aus der VB5-Hilfe zur Dim-Anweisung: "Bei der Initialisierung wird [...] Zeichenfolgen variabler Länge eine Null-Zeichenfolge ("") zugewiesen."
Probieren wir es aus:
Scheint alles zu stimmen. Seltsam ist aber folgendes:
Sollte es da doch einen Unterschied geben?Legen wir zum Test eine Datei "test.ini" mit folgendem Inhalt an:
[Section1]
Danach sieht es in "test.ini" so aus:
[Section1] Im Prinzip ist ein String mit einem Objekt vergleichbar (Genaueres hierzu findet man in diesem MSDN-Artikel). Bei der Deklaration mit Dim wird ein Zeiger (Long-Wert, der die Speicheradresse des Objekts enthält) angelegt; da das Objekt selbst aber noch nicht existiert, erhält der Zeiger den Wert 0. Dasselbe passiert, wenn mit
ein "echtes" Objekt deklariert wird. Der Zeiger wird zwar angelegt, aber ohne das Schlüsselwort
New gibt es noch kein Objekt. Folglich kann auch auf dessen Eigenschaften und Methoden
noch nicht zugegriffen werden:
Mit If n Is Nothing Then ... findet man leicht heraus, ob ein Objekt instanziiert ist oder nicht;
ist es nicht instanziiert, setzt es einen Laufzeitfehler, wenn man dennoch auf seine Eigenschaften oder
Methoden zuzugreifen versucht.
Anders beim String: Wenn man den Wert eines Strings abfragt (Debug.Print x), wird eigentlich eine Funktion der String-Instanz aufgerufen. Es gibt aber keinen Laufzeitfehler, wenn dieser String noch gar nicht existiert! Hier mogelt VB und gaukelt vor, der Zeiger repräsentiere ein gültiges String-Objekt der Länge 0:
Das ist innerhalb der Grenzen von VB alles gar kein Problem. Wird der uninitialisierte String aber ans API
übergeben, kann sich VB nicht "erklärend zwischenschalten", und es kommt zu seltsamen Effekten, im schlimmsten
Fall zu einer Schutzverletzung. Das unterschiedliche Verhalten von WritePrivateProfileString() ist damit auch
erklärt:
Es wird ein Null-Zeiger übergeben; per Definition löscht dies den Eintrag.
Es wird ein Zeiger auf einen String der Länge 0 uebergeben; folglich bleibt der Eintrag erhalten, nur
der Wert wird zurückgesetzt.Die einzig sichere Methode, zu entscheiden, ob ein String "" oder vbNullString ist, ist die StrPtr()-Funktion, die den Wert des String-Zeigers zurückliefert. Leider hat Microsoft diese Funktion nicht dokumentiert. Und der eingangs zitierte Satz aus der Online-Hilfe von VB5 zur Dim-Anweisung ist definitiv ebenso falsch wie die im Objekt-Katalog enthaltene Definition Const vbNullString = "". Hier werden Fakten verschleiert, die im Umgang mit dem API von grosser Bedeutung sein können. |
|
Hauptseite > Tips zu VB5/6 > diese Seite | |
© 2001-2021 Wolfgang Enzinger |