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

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

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


person prostynick    schedule 09.06.2011    source источник
comment
Вероятно, только @Eric Lippert сможет ответить на этот вопрос. Есть веские причины сделать то или иное (а также компромиссы). Я так же удивлен, как и вы, что C# делает и то, и другое.   -  person Yuck    schedule 09.06.2011


Ответы (5)


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

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

person jason    schedule 09.06.2011

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

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

person Xaisoft    schedule 09.06.2011

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

person Daniel Hilgarth    schedule 09.06.2011

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

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

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

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

person Michael Burr    schedule 09.06.2011

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

person leppie    schedule 09.06.2011
comment
Это причина того, что перед строкой стоит длина. Это не причина для дополнительного использования завершающего символа - person Daniel Hilgarth; 09.06.2011
comment
@ Дэниел Хилгарт: И почему я не продублировал другие ответы. Вопрос требует аргументации с обеих сторон. - person leppie; 09.06.2011
comment
Извините, я не понимаю вашего комментария - прийти еще раз? В вопросах спрашивается, какова причина использования оба вместе. А не то, что рассуждения для того или другого по своему - person Daniel Hilgarth; 09.06.2011
comment
Вы правы, но я думаю, вопрос заключается в том, почему оба используются одновременно. На самом деле для определения длины строки требуется только одно или другое. - person Yuck; 09.06.2011
comment
Да, мне интересно, почему оба используются вместе и одновременно, а не только один из них (конкретно - с префиксом длины). - person prostynick; 09.06.2011