Not many takers on
WWWTC #15, but
Jason finally nailed it.
The bug in the code revolves around how VB allocates arrays. The following code
snippet creates an array of 5 System.Char objects, and will output the number 5
to the screen, right?
Dim length As
Integer = 5
Dim chars()
As
Char = New Char(length)
{}
Console.WriteLine(chars.Length)
The output is "6", which still astonishes those of us (me, at least) who hail
from the land of semicolons. The number I pass to the New clause in VB doesn't
specify the number of elements in the array, but the upper bounds of the array.
Passing a 5 tells VB to create an array with 6 elements indexed 0 to 5.
I suspect this behavior is a compromise over the definition of an array's lower
bound. Does an array start at 0? Does an array start at 1? It's a religious debate,
but a VB developer could use the chars array like so:
For i As
Integer = 0
To 4
Console.WriteLine(chars(i))
Next
... or like so:
For i As
Integer = 1
To 5
Console.WriteLine(chars(i))
Next
... and neither will fail with an index out of bounds exception.
This behavior does
cause a problem, however, when you want a precise number of characters and forget
how New works. The unit test failed because it expected to get back a string with
a length of 6 ("edoCoTedO"), but the actual string had a length of 7 (with a 0 character
tacked on the end).
The fix is to create the array by passing the length of the string minus 1.