Какие строки действительно есть в .NET?

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

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

10.12.2008 19:52:42
Почему ты спрашиваешь? Любопытство? Какая-то проблема, с которой вы столкнулись?
John Sheehan 10.12.2008 19:56:21
Волшебный кусочек кибер-шпагата, погруженный в множество персонажей.
Echostorm 10.12.2008 20:03:58
Пожалуйста, отредактируйте вопрос, чтобы упомянуть .NET где-то в нем. Я ответил на основании вопроса тега.
Mehrdad Afshari 10.12.2008 20:11:15
9 ОТВЕТОВ
РЕШЕНИЕ

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

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

7
10.12.2008 20:08:48

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

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

1
10.12.2008 20:12:02
Черт возьми, 44 секунды! = P
Erik Forbes 10.12.2008 19:55:33
Какое определение использует термин, определяемый в самом определении? :)
Rob Hruska 10.12.2008 20:02:39
Первая строка - это имя ключевого слова, вторая - «строка» как общий термин :)
Mehrdad Afshari 10.12.2008 20:03:49
Определение Microsoft, я думаю, что они имеют в виду Класс с именем «string» представляет строку (символ) юникода ...;)
Patrick Desjardins 10.12.2008 20:03:50
Я полагаю, что могу принять это как ответ. Я также закончу этот комментарий смайликом, потому что, очевидно, это то, что мы должны делать? :)
Rob Hruska 10.12.2008 20:05:52

Семантическое значение строки является вторым.

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

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

3
10.12.2008 20:06:13

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

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

0
10.12.2008 19:56:33

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

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

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

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

7
10.12.2008 20:08:03

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

0
10.12.2008 20:01:17

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

0
10.12.2008 20:08:48
Если вы прочитали вопрос и фактически имеете в виду, что он зависит от того, какой язык ".Net", то вы ошибаетесь ... это не так ... Все строки .net независимо от языка одинаковы, как определено в .Net Система общего типа (CTS) ...
Charles Bretana 10.12.2008 20:30:35

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

0
10.12.2008 20:11:08

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

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

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

0
10.12.2008 20:27:28