I ran into a little surprise a few days ago. With something as innocuous as the “Replace” function, of all things!
Now, Replace has been around since, well, forever. The basic function has always looked like this:
X = Replace(StringToSearch, StringToSearchFor, StringToReplaceWith)
No big deal. Used it for years.
So imagine my surprise when I got an “Object not set” error on a string variable that I’d just used Replace on! How could that be?
So I checked the variable value. It was, in fact, “Nothing”.
Ok, So I rerun the code, stepping through. The variable starts out as a string containing some data, then gets trimmed, and the resulting string in empty (still a string, just containing no characters).
Then I perform a replace on it, and suddenly, the string is Nothing?!
So, I coded up the following little test snippet.
Private Sub Test() Dim x = "Test A B C" Debug.Print(Replace(x, "A", "Z")) 'Results in "Test Z B C" Debug.Print(x.Replace("A", "Z")) 'also results in "Test Z B C" x = "" x = x.Replace("A", "Z") Debug.Print(x Is Nothing) 'result is false, (x stays "") x = "" x = Microsoft.VisualBasic.Replace(x, "A", "Z") Debug.Print(x Is Nothing) 'result is true!?! x = "" x = Replace(x, "A", "Z") Debug.Print(x Is Nothing) 'Result is true!?! End Sub
The first two results are exactly as expected. The search string is replaced with the replace string.
The next result, ALSO, is as expected. x starts out as an empty string. I perform a replace on it, and the result is, duh! an empty string! Now, for as long as I’ve known the Replace function, this has not been how it works.
But the next two results both result in FALSE, meaning the result of the String.Replace function and of the Microsoft.VisualBasic.Replace function is Nothing, and not an empty string!
Google It!
So I started googling. I turned up this bug report from .net 1.1.
The response from Microsoft is:
Posted by Microsoft on 5/18/2006 at 3:02 PMHi,
Thank you very much for reporting this issue. Unfortunately, VB had this behavior in previous version too and we can’t change it due to backward compatibility problem.
Thanks,
VB Development Team.
“Can’t be!” I yelled. Well, ok, I didn’t yell, but I exclaimed heartily <g>.
So I fired up VB6 and wrote up another test program, then ran it.
You can see the VB supplied variable inspector tooltip as I hovered over the value of X after I’d just run the normal REPLACE function on it in the EXACT SAME WAY as I’m doing in VB.net.
I hate to burst bubbles, but X starts out as an empty string, I run the REPLACE function on it, and it ends up… wait for it… an empty string! Not a null/nothing variable.
Maybe it’s another weird edge case scenario that the VB Team is talking about there, but, come on! This has got to be THE SINGLE MOST COMMON invocation of Replace. Why on earth should it work differently from VB6 to VB.net?
And one other thing. String.Replace is part of the .net FRAMEWORK people. It has virtually nothing to do with VB6 and certainly, compatibility shouldn’t have been a concern there. May for the version in the VisualBasic namespace, but not that String.Replace. Weak!
Short version of the story
Be VERY CAREFUL of using either String.Replace or the Microsoft.VisualBasic.Replace functions.
If you DO need them (they have a nice case-insensitive switch, which makes them handy), write a wrapper function that deals with this VB.net bug (yeah, I went there <g>) so you won’t get bitten and end up with rash.