Какие строки действительно есть в .NET? - PullRequest
5 голосов
/ 10 декабря 2008

Является ли строка на самом деле массивом символов (is-a), или она имеет массив символов в качестве внутреннего хранилища (has-a), или это собственный объект, который может представлять себя как массив символов?

Я более склонен говорить, что это его собственный объект, но тогда почему мы так склонны всегда говорить "Строка - это массив символов ..."?

Ответы [ 9 ]

7 голосов
/ 10 декабря 2008

Это зависит от вашего определения слова «строка».

System.String Тип в .NET имеет массив символов в качестве внутреннего хранилища (он также хранит длину (например, O (1)).

Но слово string означает последовательное вхождение чего-либо в целом, что также может означать массив символов:))

Кстати, когда я сказал, что string тип имеет «массив символов», я не имел в виду «поле типа char[]», в частности. Я имел в виду общее значение термина «массив» как упорядоченная коллекция чего-либо. :))

7 голосов
/ 10 декабря 2008

. NET строка не просто массив символов. Он содержит массив символов, так что строго говоря, он имеет -a.

Кроме того, есть много тонкостей, связанных с Unicode, где он не ведет себя что-либо как массив Объединение символа может сделать гораздо больше, чем просто увеличить длину строки на единицу и вставить новый символ в конце. Согласно правилам нормализации Unicode, он может фактически изменить всю строку. Так что - это определенно не что иное, как массив символов, но где-то внутри класса такой массив существует.

3 голосов
/ 10 декабря 2008

Семантическое значение строки - второе.

Класс .Net String поддерживает внутреннее хранилище (has-a) и может открывать это хранилище так много абстрактных способов, как выбирают дизайнеры.

Вопрос такой: «Является ли яблоко красным круглым? Потому что я всегда думал, что это фрукт».

1 голос
/ 10 декабря 2008

MSDN : тип строки представляет собой строку символов Unicode.

Это означает: это массив символов Юникода.

0 голосов
/ 10 декабря 2008

Функционально строка представляет собой список или последовательность символов. Строки часто хранятся прозрачно как символьные массивы (например, в C), поэтому мы часто ссылаемся на них таким образом. Массивы обеспечивают удобный произвольный доступ к символам, что важно для некоторых алгоритмов.

Однако для других целей хранение строк Unicode в формате UTF-8 может быть наиболее подходящей формой. Обратите внимание, что, хотя он хранится в байтовом массиве, больше нет однозначного соответствия между байтами и символами: вашим строковым алгоритмам обычно требуется последовательно обращаться к символам с самого начала - в виде списка.

Мораль этой истории такова: ваш строковый код должен требовать произвольного доступа, только если он действительно нужен. Вы можете быть удивлены, как редко вам действительно нужен массив символов.

0 голосов
/ 10 декабря 2008

Зависит от того, как именно вы на это смотрите. Если вы прикрепите его с помощью GCHandle, а затем посмотрите на память, в которой он находится, вы увидите, что на самом деле это дескриптор 32-битной длины, за которым сразу следует массив символов Unicode (имейте в виду, что AddrOfPinnedObject даст вам адрес первого символ, не длина. Если бы он дал адрес длины, это было бы намного менее полезно для P / Invoking).

0 голосов
/ 10 декабря 2008

Это зависит от языка и реализации. На самом базовом уровне (строка ascii char *) это последовательный ряд адресов памяти, каждый из которых содержит короткий int, соответствующий коду ascii и оканчивающийся нулем (char (0)). Большинство языков более высокого уровня предоставляют строковый объект, который имеет массив символов , а также удобные методы, потому что работа со строками char * более или менее болезненна сзади.

0 голосов
/ 10 декабря 2008

Строка - это имя класса. У него разные значения на разных языках. Это может быть Unicode или ASCII, что означает, что механизм хранения представляет собой серию байтов. Этот класс предоставляет функции для управления собственным внутренним хранилищем, и он не предназначен для прямого доступа и изменения из-за того, что он может содержать символы в различных кодировках. Так что для вашего вопроса у него есть хранилище байтов.

0 голосов
/ 10 декабря 2008

Абстрактным образом (и я предполагаю, когда выложены в память) - это массив символов.

Поправь меня, если я ошибаюсь, думая об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...