Почему строки C# / .Net имеют префикс длины и null завершены?
после прочтения в чем смысл нулевым символом строки? и некоторые подобные вопросы я обнаружил, что в C#/.Net строки, внутренне, как длина с префиксом и null заканчивается, как в тип данных BSTR.
в чем причина того, что строки имеют как префикс длины, так и null вместо eg. только с префиксом длины?
5 ответов
Длина с префиксом, чтобы вычислительная длина была O(1)
.
Null завершен, чтобы сделать маршалинг неуправляемым blazing fast (неуправляемый, вероятно, ожидает строки с нулевым завершением).
вот выдержка из блога Джона Скита в должности о строк:
хотя строки не завершаются нулем, насколько это касается API, массив символов завершается нулем, так как это означает, что он может быть передан непосредственно неуправляемым функциям без какого-либо копирования, предполагая, что inter-op указывает, что строка должна быть маршалирована как Unicode.
В то время как поле длины облегчает фреймворку определение длины строки (и позволяет строке содержать символы с нулевым значением), существует очень много вещей, которые фреймворк (или пользовательские программы) должны иметь дело с ожидаемыми нулевыми завершенными строками.
как Win32 API, например.
поэтому удобно держать нулевой Терминатор в конце строковых данных, потому что он, вероятно, должен быть там довольно часто в любом случае.
обратите внимание, что c++'s std::string
класс реализован таким же образом (в MSVC в любом случае). По той же причине, я уверен (c_str()
часто используется для передачи std::string
что-то, что хочет строку в стиле C).
лучше всего предположить, что поиск длины постоянен(O(1)) по сравнению с его пересечением, запущенным в O (n).