Почему строки C # /. Net имеют префикс длины и нулевое значение? - PullRequest
18 голосов
/ 09 июня 2011

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

По какой причине строки имеют префикс длины и заканчиваются нулем вместо, например. только с префиксом длины?

Ответы [ 5 ]

21 голосов
/ 09 июня 2011

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

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

13 голосов
/ 09 июня 2011

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

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

4 голосов
/ 09 июня 2011

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

3 голосов
/ 09 июня 2011

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

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

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

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

0 голосов
/ 09 июня 2011

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

...