Почему строки C# / .Net имеют префикс длины и null завершены?

после прочтения в чем смысл нулевым символом строки? и некоторые подобные вопросы я обнаружил, что в C#/.Net строки, внутренне, как длина с префиксом и null заканчивается, как в тип данных BSTR.

в чем причина того, что строки имеют как префикс длины, так и null вместо eg. только с префиксом длины?

5 ответов


Длина с префиксом, чтобы вычислительная длина была O(1).

Null завершен, чтобы сделать маршалинг неуправляемым blazing fast (неуправляемый, вероятно, ожидает строки с нулевым завершением).


вот выдержка из блога Джона Скита в должности о строк:

хотя строки не завершаются нулем, насколько это касается API, массив символов завершается нулем, так как это означает, что он может быть передан непосредственно неуправляемым функциям без какого-либо копирования, предполагая, что inter-op указывает, что строка должна быть маршалирована как Unicode.


скорее всего, для обеспечения простой совместимости с COM.


В то время как поле длины облегчает фреймворку определение длины строки (и позволяет строке содержать символы с нулевым значением), существует очень много вещей, которые фреймворк (или пользовательские программы) должны иметь дело с ожидаемыми нулевыми завершенными строками.

как Win32 API, например.

поэтому удобно держать нулевой Терминатор в конце строковых данных, потому что он, вероятно, должен быть там довольно часто в любом случае.

обратите внимание, что c++'s std::string класс реализован таким же образом (в MSVC в любом случае). По той же причине, я уверен (c_str() часто используется для передачи std::string что-то, что хочет строку в стиле C).


лучше всего предположить, что поиск длины постоянен(O(1)) по сравнению с его пересечением, запущенным в O (n).