Является ли строка на самом деле массивом символов (is-a), или у нее есть массив символов в качестве внутреннего хранилища (has-a), или это собственный объект, который может представлять себя как массив символов?
Я более склонен сказать, что это собственный объект, но тогда почему мы так склонны всегда говорить: «Строка - это массив символов ...»?
Волшебный кусочек кибер-шпагата, окутанный липким набором персонажей.
Отредактируйте вопрос, чтобы где-нибудь в нем упоминалось .NET. Я ответил на основе вопроса.





MSDN: тип строки представляет собой строку символов Юникода.
Это означает: это массив символов Юникода.
В каком виде определения используется термин, который определяется в самом определении? :)
Первая строка - это имя ключевого слова, вторая означает «строка» как общий термин :)
Определение Microsoft, я думаю, они имеют в виду. Класс с именем «строка» представляет собой строку (символ) юникода ...;)
Полагаю, я могу принять это как ответ. Я также закончу этот комментарий смайликом, потому что, очевидно, это то, что мы должны делать? :)
Получил, проголосовал дважды здесь, хммм, это официальный ответ от Microsoft: P
Doak, наверное люди слишком сильно ненавидят MS! Кстати, это официальное определение строкового типа, а не ответ на вопрос. :))
Семантическое значение строки - второе.
Класс .Net String поддерживает внутреннее хранилище (has-a) и может раскрывать это хранилище столькими абстрактными способами, которые выберут дизайнеры.
Вопрос такой: «Является ли яблоко круглым красным? Потому что я всегда думал, что это фрукт».
В абстрактном смысле (и я предполагаю, что когда он выложен в памяти) - это массив символов.
Поправьте меня, если я так ошибаюсь.
Это зависит от вашего определения слова «строка».
Тип System.String в .NET имеет символьный массив в качестве внутреннего хранилища (например, он также хранит длину (которая равна O (1))).
Но слово строка означает последовательное появление чего-то в целом, что также может означать массив символов :))
Кстати, когда я сказал, что тип string имеет «массив символов», я не имел в виду конкретно «поле типа char[]». Я имел в виду общий смысл термина «массив» как упорядоченного набора чего-либо. :))
Строка - это имя класса. Он имеет разное значение на разных языках. Это может быть юникод или ASCII внутренне, что означает, что механизм хранения представляет собой серию байтов. Этот класс предоставляет функции для управления собственным внутренним хранилищем, и он не предназначен для прямого доступа и изменения из-за того, что он может содержать символы в различных кодировках. Итак, для целей вашего вопроса у него есть хранилище байтов.
Это зависит от языка и реализации. На самом базовом уровне (ascii char * string) это последовательный ряд адресов памяти, каждый из которых содержит короткий int, соответствующий ascii-коду и завершающийся нулевым значением (char (0)). Большинство языков более высокого уровня предоставляют строковый объект, который представляет собой массив символов имеет, а также удобные методы, потому что работа со строками char * более или менее проблематична.
Если вы читаете вопрос и на самом деле имеете в виду, что он зависит от того, какой язык ".Net", тогда вы ошибаетесь ... это не ... Все строки .net независимо от языка одинаковы, как определено .Net Система общих типов (CTS) ...
строка .NET - это не просто массив символов. Он содержит массив символов, так что, строго говоря, у него есть -a.
Более того, есть много тонкостей, связанных с Unicode, когда он не ведет себя что-нибудь как массив. Объединение символа может сделать гораздо больше, чем просто увеличить длину строки на единицу и вставить новый символ в конец. Согласно правилам нормализации Unicode, он может фактически изменить всю строку. Таким образом, является определенно не что иное, как массив символов, но где-то внутри класса такой массив существует.
Зависит от того, как именно вы на это смотрите. Если вы закрепите его с помощью GCHandle, а затем посмотрите на память, в которой он находится, вы увидите, что на самом деле это 32-битный дескриптор, за которым сразу следует массив символов Юникода (имейте в виду, что AddrOfPinnedObject даст вам адрес первого символ, длина нет. Если бы он давал адрес длины, это было бы гораздо менее полезно для P / Invoking).
Функционально строка - это список или последовательность символов. Строки часто хранятся прозрачно как массивы символов (например, в C), поэтому мы часто обращаемся к ним именно так. Массивы обеспечивают удобный произвольный доступ к символам, что важно для некоторых алгоритмов.
Однако для других целей хранение строк Unicode в формате UTF-8 может быть наиболее подходящей формой. Обратите внимание, что, хотя он хранится в массиве байтов, больше нет взаимно однозначного соответствия между байтами и символами: ваши строковые алгоритмы обычно нуждаются в последовательном доступе к символам с самого начала - в виде списка.
Мораль этой истории такова: ваш строковый код должен требовать произвольного доступа только в том случае, если он действительно нужен. Вы можете быть удивлены, насколько редко вам действительно нужен массив символов.
Почему ты спрашиваешь? Любопытство? С какой-то проблемой вы столкнулись?