Что на самом деле представляют собой строки в .NET?

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

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

Почему ты спрашиваешь? Любопытство? С какой-то проблемой вы столкнулись?

John Sheehan 10.12.2008 22:56

Волшебный кусочек кибер-шпагата, окутанный липким набором персонажей.

Echostorm 10.12.2008 23:03

Отредактируйте вопрос, чтобы где-нибудь в нем упоминалось .NET. Я ответил на основе вопроса.

mmx 10.12.2008 23:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
3
494
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

В каком виде определения используется термин, который определяется в самом определении? :)

Rob Hruska 10.12.2008 23:02

Первая строка - это имя ключевого слова, вторая означает «строка» как общий термин :)

mmx 10.12.2008 23:03

Определение Microsoft, я думаю, они имеют в виду. Класс с именем «строка» представляет собой строку (символ) юникода ...;)

Patrick Desjardins 10.12.2008 23:03

Полагаю, я могу принять это как ответ. Я также закончу этот комментарий смайликом, потому что, очевидно, это то, что мы должны делать? :)

Rob Hruska 10.12.2008 23:05

Получил, проголосовал дважды здесь, хммм, это официальный ответ от Microsoft: P

Patrick Desjardins 10.12.2008 23:08

Doak, наверное люди слишком сильно ненавидят MS! Кстати, это официальное определение строкового типа, а не ответ на вопрос. :))

mmx 10.12.2008 23:09

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

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

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

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

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

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

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

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

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

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

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

Если вы читаете вопрос и на самом деле имеете в виду, что он зависит от того, какой язык ".Net", тогда вы ошибаетесь ... это не ... Все строки .net независимо от языка одинаковы, как определено .Net Система общих типов (CTS) ...

Charles Bretana 10.12.2008 23:30
Ответ принят как подходящий

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

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

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

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

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

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

Другие вопросы по теме