I don’t know about C#, but Golang and Rust documentation -both- state that string/str are read-only slices. That is to say, their representation is just like other slices. Which would imply boxed.
Do you have evidence that they’re unboxed? For instance, a program that constructed strings of increasing size, then -repeatedly- performed substring operations (let’s say, substring of the middle-half of the string), and showing that the time for the program was a function of the size of the strings (which would imply unboxed) rather than independent of the size of the strings (which would imply boxed).
Or blog posts that state they’re unboxed ? I’m asking b/c it seems pretty difficult-to-imagine how you’d implement “unboxed slices” in any way that made sense as “slices”.