Strings
are immutable. If you want to modify a sequence of characters, use StringBuilder
. At least, that’s whats officially said. But in the framework there is at least one method that does modify a string:
TextRenderer.MeasureText()
with ModifyString
and EndEllipses
will modify your string to match the ellipsed text if ellipsing happens. You can look at this VB# example on codeproject using TextRenderer.MeasureText()
for trimming text on how it is used.
The string seems to be modified directly in native code by DrawTextEx
from user32.dll
. Additionally to the scary fact that strings are not immutable, the length of the string is not updated, regardless if the resulting string is shorter!
For instance if you have a string “aaaaaaa
” which will be truncated to “aa...
“, the Length
property will still return 7 for the shortened string. The debugger shows that the string will in fact be “aa…\0a” after the operation. So maybe it might be right that the string is still 7 characters long but most outputting functionality like Console.Out.WriteLine()
gets confused sometimes and stops any further output to the debugger or console under certain conditions.
A very quick investigation of the System.Drawing assembly using Lutz Roeder’s fabulous .NET Reflector showed that at least there should be no memory corruption in case “WW
” would get ellipsed to “W...
“, as DrawTextEx
takes the length of the buffer and should result only in “W.
“.
Summing up, I find the corruption of an immutable string by an official Microsoft API very troubling.