After reading What's the rationale for null terminated strings? and some similar questions I have found that in C#/.Net strings are, internally, both length-prefixed and nul
Length prefixed so that computing length is O(1).
O(1)
Null terminated to make marshaling to unmanaged blazing fast (unmanaged likely expects null-terminated strings).