Comments 5
Спасибо за инфу. Всю жизнь думал, что строка в памяти - это байты, которые заканчиваются нулём.
С уникодом не совсем понял. Ведь у него не одинаковые длинны одного символа, там UTF-8, UTF-16. т.е. неважно, какой формат мы берём - в памяти держится всегда UTF-16?
Длина строк ограничивается нулём в C/C++ и многих других языках, но в .NET и Pascal например не так.
В памяти UTF-16, поэтому свойство Length может быть больше чем реальное количество символов, даже если нормализовать в композитную форму, потому что суррогаты. Из-за этого например ограничивать длину произвольной исходной строки, путём использования Substring нельзя, потому что можно разрезать суррогат посередине и получить невалидный символ (только начало пары). Для правильного разделения есть тип StringInfo.
Нет. Текстовые строки Unicode бывают разными Текстовые строки в языках программирования
В памяти строка представляется как последовательность произвольных 16-битный кодюнитов, которая интерпретируется как UTF-16, но без какой-либо проверки на корректность такой последовательности.
А вы уверены про "extra field" 4 байта? Если моя память меня не подводит лейаут у строки как раз [8b header][8b pMT][4b Length][data...
И ещё у вас ссылки на исходную имплементацию NativeAOT, это немного другое чем CLR/JIT
System.String не то, чем кажется. Представление строк в памяти .NET