Подтвердить что ты не робот

Почему С#/. Чистые строки с префиксом и нулем завершены?

После прочтения В чем обоснование строк с нулевым завершением? и некоторых подобных вопросов я обнаружил, что в С#/. Строковые строки являются внутренними, как префиксом длины, так и null завершен как Тип данных BSTR.

В чем причина того, что строки, как префикс длины, так и нуль завершены, а не, например,. только длина с префиксом?

4b9b3361

Ответ 1

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

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

Ответ 2

Вот выдержка из Jon Skeet Blog Сообщение о строках:

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

Ответ 3

Скорее всего, чтобы обеспечить удобство взаимодействия с COM.

Ответ 4

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

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

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

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

Ответ 5

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