Тип string . Примеры. Функции, свойства, операции
В языке C# встроенный тип данных string поддерживает символьные строки в кодировке Unicode. Для строк типа string можно выделить следующие особенности:
- любая переменная типа string представляет собой объект класса System.String ;
- тип string относится к ссылочным типам а не типам-значениям;
- строки типа string размещаются в «куче» (heap);
- к строкам типа string можно применять разнообразные методы, свойства и операции;
- строку типа string можно создавать с использованием оператора new и без использования этого оператора путем присваивания = ;
- содержимое объекта типа string изменить нельзя.
Пример строки-литерала типа string :
⇑
2. Способы создания экземпляра типа string
Как известно тип string есть псевдонимом класса System.String , который имеет несколько конструкторов. С помощью этих конструкторов можно создавать экземпляры класса string . Ниже приводится пример программы, в которой продемонстрировано создание экземпляров типа string разными способами.
Результат выполнения программы
⇑
3. Как в переменную типа string занести значение строки? Операция присваивания =
Для этого нужно использовать оператор присваивания ‘ = ‘.
Вариант 1. Присваивание после описания.
Вариант 2. Присваивание во время описания (начальная инициализация).
Вариант 3. Использование метода Copy() .
⇑
4. Как определить, равны ли две строки типа s tring между собой? Операция сравнения ==
Две строки можно сравнивать обычным оператором сравнения « == «.
Фрагмент кода, который определяет равенство (неравенство) двух строк:
⇑
5. Как сравнить две строки типа string в лексикографическом порядке? Метод CompareTo()
В этом случае можно использовать метод CompareTo() . Метод возвращает -1 , 0 или 1 .
В приведенном примере видно результат работы метода.
⇑
6. Как соединить две строки типа string ? Метод Concat() , операция +
Способ №1 — функция Concat() .
Способ № 2 — использование оператора «+».
⇑
7. Как скопировать одну строку типа s tring в другую? Метод Copy() , оператор присваивания =
Способ № 1 — оператор присваивания.
Способ №2 — метод Copy() .
⇑
8. Вставка подстроки начиная из заданного индекса. Метод Insert()
Для вставки подстроки используется функция Insert() . Функция принимает два параметра. Первый параметр – позиция индекса в строке, из которой делается вставка (начинается с 0 ). Второй параметр – текст самой строки.
Если задать неверный индекс за пределами диапазона, то будет сгенерирована исключительная ситуация.
⇑
9. Поиск и получение индекса первого вхождения подстроки в данную строку. Метод IndexOf()
Эта операция реализуется функцией IndexOf() . Если найдена подстрока в строке, то функция возвращает позицию первого вхождения. В другом случае функция возвращает -1 .
Функция имеет перегруженные варианты реализации.
⇑
10. Поиск и получение индекса последнего вхождения подстроки в данную строку функцией LastIndexOf() .
Функция имеет несколько перегруженных реализаций. Нумерация индекса последнего вхождения начинается с 0 .
⇑
11. Как определить длину строки типа string ? Свойство Length
Для определения длины строки (количество символов) типа string используется свойство Length.
⇑
12. Создание строки заданной ширины. Функции PadLeft() и PadRight()
Функции PadLeft() и PadRight() используются для создания форматированной строки, в которой позиции справа или слева заполняются пробелами.
⇑
13. Удаление заданного количества символов из строки. Функция Remove()
Функция Remove() имеет две реализации. В первой реализации функция имеет два параметра. Во второй – один параметр.
Пример 1. Реализация функции Remove() с двумя параметрами.
В данном примере функция Remove() получает два параметра. Первый параметр – позиция, из которой делается удаление. Второй параметр – количество удаленных символов.
Пример 2. Реализация с одним параметром.
В этом примере функция получает один параметр. Этот параметр определяет позицию из которой будет осуществлено удаление символов до конца строки.
то будет удалена вся строка.
Пример 3. Если нужно удалить последний символ в строке, то нужно написать такой код.
⇑
14. Замена символов в строке. Функция Replace()
Функция Replace() имеет два варианта реализации.
Первый вариант оперирует строками типа string . Второй вариант оперирует типом char .
Пример 1. Использование функции Replace() для замены одной строки на другую.
Пример 2. Использование функции Replace() для замены символа ‘0’ на символ ‘A’ .
⇑
15. Как в строке выделить подстроку. Функция Substring()
Функция Substring() имеет две реализации.
Вариант 1. Выделение подстроки с заданной позиции до конца строки.
⇑
16. Преобразование числовой строки типа string в целое число. Функция Parse()
Функция Parse() разрешает переводить строку, которая состоит из цифр, в целое число. Такая функция полезна если нужно получить число, которое было введено из клавиатуры и получено в виде строки. Например, ввод из элемента управления типа TextBox .
⇑
17. Преобразование целого числа в строку. Функция ToString()
Функция ToString() переводит целое число в его строчное представление. Например, такая функция полезная, если нужно вывести целое число на форму в элементе управления Label .
⇑
18. Преобразование строки string в число с плавающей запятой (вещественное число)
При преобразовании строки в соответствующее вещественное число, важно учитывать кодировку символов.
Если у вас установлена операционная система с кирилличной кодировкой и настроены соответствующие региональные стандарты, тогда символ ‘.’ может быть заменен на символ ‘,’ . Это связано с тем, что в странах, которые используют кириллицу как разделитель между целой и дробной частями, есть символ ‘ ,’ (запятая). А в англоязычных странах разделителем целой и дробовой частей есть символ ‘.’ (точка).
Символ-разделитель целой и дробной частей можно изменить в региональных настройках Windows.
Поэтому, в ОС Windows с кириллическим кодированием по умолчанию, следующий код вызовет исключительную ситуацию FormatException с сообщением: « Input string was not in a correct format » (Исходная строка имеет неверный формат).
Ниже приведен правильный вариант для ОС с кирилличной кодировкой:
⇑
19. Преобразование числа с плавающей запятой в string .
⇑
20. Перевод значения переменной логического типа bool в строку string
Если ввести неправильное значение в строку s , то генерируется исключительная ситуация с сообщением:
⇑
21. Постоянство строк. Как в строке типа string заменить символ в заданной позиции: s[index] = c
В языке C# тип string имеет одну особенность. Доступ к отдельному символу строки осуществляется в режиме чтения. Непосредственно изменить значение символа в строке не получится. Это означает, что строки есть постоянными (константными).
Нижеследующий фрагмент кода
вызовет ошибку компилятора
Значит, значение символа в заданной позиции строки типа string можно только прочитать.
Чтобы решить эту задачу можно использовать (как пример) один из предложенных способов.
Способ 1. Использование методов Substring() и String() . При использовании этого способа нужно выполнять проверку значения индекса на корректность. Если значение индекса выходит за пределы размерности строки, то возникнет исключительная ситуация.
Способ 2. Использование оператора цикла.
Способ 3. Использование методов Remove() и Insert() . В этом случае также нужно проверять индекс замены на корректность.
Строки в C# и .NET
От переводчика: Джон Скит написал несколько статей о строках, и данная статья является первой, которую я решил перевести. Дальше планирую перевести статью о конкатенации строк, а потом — о Юникоде в .NET.
Тип System.String (в C# имеющий алиас string) является одним из наиболее часто используемых и важных типов в .NET, и вместе с тем одним из самых недопонимаемых. Эта статья описывает основы данного типа и развенчивает сложившиеся вокруг него мифы и непонимания.
Так что же такое string
Строка в .NET (далее — string, я не буду использовать полное имя System.String каждый раз) является последовательностью символов. Каждый символ является символом Юникода в диапазоне от U+0000 до U+FFFF (будет рассмотрено далее). Строковый тип имеет следующие характеристики:
Строка является ссылочным типом
Существует распространённое заблуждение о том, что строка является значимым типом. Это заблуждение истекает из свойства неизменяемости строки (см. следующий пункт), так как для неискушенного программиста неизменяемость часто по поведению кажется схожей со значимыми типами. Тем не менее, string — ссылочный тип, со всеми присущими ссылочным типам характеристиками. Я более детально расписал о различиях между ссылочными и значимыми типами в своих статьях «Parameter passing in C#» и «Memory in .NET — what goes where».
Строка является неизменяемой
Никак невозможно изменить содержимое созданной строки, по крайней мере в безопасном (safe) коде и без рефлексии. Поэтому вы при изменении строк изменяете не сами строки, а значения переменных, указывающих на строки. Например, код s = s.Replace («foo», «bar»); не изменяет содержимое строки s, которое было до вызова метода Replace — он просто переназначает переменную s на новообразованную строку, которая является копией старой за исключением всех подстрок «foo», заменённых на «bar».
Строка может содержать значение null
В языке C строки являются последовательностями символов, оканчивающимися символом ‘\0‘, также называемым «nul» или «null». Я называю его «null», так как именно такое название имеет символ ‘\0’ в таблице символов Юникода. Не путайте символ «null» с ключевым словом null в C# — тип System.Char является значимым, а потому не может принимать значение null . В .NET строки могут содержать символ «null» в любом месте и работать с ним без каких-либо проблем. Тем не менее, некоторые классы (к примеру, в Windows Forms) могут расценивать «null»-символ в строке как признак конца строки и не учитывать всё содержимое строки после этого символа, поэтому использование «null»-символов таки может стать проблемой.
Строка переопределяет оператор равенства ==
При вызове оператора == для определения равенства двух строк происходит вызов метода Equals , который сравнивает именно содержимое строк, а не равенство ссылок. К примеру, выражение «hello».Substring(0, 4)==»hell» возвратит true , хотя ссылки на строки по обеих сторонах оператора равенства разные (две ссылки ссылаются на два разных строковых экземпляра, которые, при этом, содержат одинаковые значения). Вместе с тем необходимо помнить, что равенство значений, а не ссылок происходит только тогда, когда оба операнда на момент компиляции являются строго строковым типом — оператор равенства не поддерживает полиморфизм. Поэтому если хотя бы один из сравниваемых операндов будет иметь тип object , к примеру (хотя внутренне и будет оставаться строкой), то будет выполнено сравнение ссылок, а не содержимого строк.
Интернирование
В .NET существует понятие «пула интернирования» (intern pool). По своей сути это всего лишь набор строк, но он обеспечивает то, что когда вы в разных местах программы используете разные строки с одним и тем же содержимым, то это содержимое будет храниться лишь один раз, а не создаваться каждый раз по-новому. Вероятно, пул интернирования зависит от конкретного языка, однако он определённо существует в C# и VB.NET, и я бы был очень удивлён, увидев язык на платформе .NET, не использующий пул интернирования; в MSIL пул интернирования очень просто использовать, гораздо проще, нежели не использовать. Наряду с автоматическим интернированием строковых литералов, строки можно интернировать вручную при помощи метода Intern , а также проверять, является ли та или иная строка уже интернированной при помощи метода IsInterned . Метод IsInterned не интуитивен, так как вы ожидаете, что он возвратит Boolean , а вот и нет — если текущая строка уже существует в пуле интернирования, то метод возвратит ссылку на неё, а если не существует, то null . Подобно ему, метод Intern возвращает ссылку на интернированную строку, причём вне зависимости от того, была ли текущая строка в пуле интернирования до вызова метода, или же она была туда занесена вместе с вызовом метода, или же пул интернирования содержит копию текущей строки.
Литералы
- \’ — одинарная кавычка, используется для объявления литералов типа System.Char
- \» — двойная кавычка, используется для объявления строковых литералов
- \\ — обратный слеш
- \0 — null-символ в Юникоде
- \a — символ Alert (№7)
- \b — символ Backspace (№8)
- \f —смена страницы FORM FEED (№12)
- \n — перевод строки (№10)
- \r — возврат каретки (№13)
- \t — горизонтальная табуляция (№9)
- \v — вертикальная табуляция (№11)
- Uxxxx — символ Юникода с шестнадцатеричным кодом xxxx
- \xn[n][n][n] — символ Юникода с шестнадцатеричным кодом nnnn, версия предыдущего пункта с переменной длиной цифр кода
- \Uxxxxxxxx — символ Юникода с шестнадцатеричным кодом xxxxxxxx, используется для вызова суррогатных пар.
Строки и отладчик
Довольно часто при просмотре строк в отладчике (используя VS.NET 2002 и VS.NET 2003) люди сталкиваются с проблемами. Ирония в том, что эти проблемы чаще всего создаёт отладчик, пытаясь быть полезным. Иногда он отображает строку в виде стандартного литерала, экранируя обратными слешами все спецсимволы, а иногда он отображает строку в виде дословного литерала, оглавляя её @. Поэтому многие спрашивают, как удалить из строки @, хотя его там фактически нет. Кроме этого, отладчики в некоторых версиях VS.NET не отображают строки с момента первого вхождения null-символа \0, и что ещё хуже, неправильно вычисляют их длины, так как подсчитывают их самостоятельно вместо запроса к управляемому коду. Естественно, всё это из-за того, что отладчики рассматривают \0 как признак окончания строки.
Учитывая такую путаницу, я пришел к выводу, что при отладке подозрительных строк их следует рассматривать множеством способов, дабы исключить все недоразумения. Я предлагаю использовать приведённый ниже метод, который будет печатать содержимое строки в консоль «правильным» способом. В зависимости от того, какое приложение вы разрабатываете, вы можете вместо вывода в консоль записывать строки в лог-файл, отправлять в трассировщики, выводит в модальном Windows-окне и т.д.
Использование памяти и внутренняя структура
В текущей реализации .NET Framework каждая строка занимает 20+(n/2)×4 байт, где n — количество символов в строке или, что одно и то же, её длина. Строковый тип необычен тем, что его фактический размер в байтах изменяется им самим. Насколько я знаю, так могут делать только массивы. По факту, строка — это и есть массив символов, расположенный в памяти, а также число, обозначающее фактический размер массива в памяти, а также число, обозначающее фактическое количество символов в массиве. Как вы уже поняли, длина массива не обязательно равна длине строки, так как строки могут перераспределяться со стороны mscorlib.dll для облегчения их обработки. Так само делает, к примеру, StringBuilder . И хотя для внешнего мира строки неизменяемые, внутри mscorlib они ещё как изменяемые. Таким образом, StringBuilder при создании строки выделяет несколько больший символьный массив, нежели того требует текущий литерал, а потом прибавляет новые символы в созданный массив до тех пор, пока они «влезают». Как только массив заполняется, создаётся новый, ещё больший массив, и в него копируется содержимое из старого. Кроме этого, в числе, обозначающем длину строки, первый бит отведён под специальный флаг, определяющий, содержит ли строка не-ASCII символы или нет. Благодаря этому флагу исполняющая среда в некоторых случаях может проводить дополнительные оптимизации.
Хотя со стороны API строки не являются null-терминированными, внутренне символьные массивы, представляющие строки, являются. А это значит, что строки из .NET могут напрямую передаваться в неуправляемый код безо всякого копирования, предполагая, что при таком взаимодействии строки будут маршаллированы как Юникод.
Кодировки строк
Если вы не знакомы с кодировками символов и Юникодом, пожалуйста, прочтите сначала мою статью о Юникоде (или её перевод на Хабре).
Как я уже сказал вначале статьи, строки всегда хранятся в Юникод-кодировке. Всякие домыслы о Big-5-кодировках или UTF-8-кодировках являются ошибкой (по крайней мере, по отношению к .NET) и являются следствием незнания самих кодировок или того, как .NET обрабатывает строки. Очень важно понять этот момент — рассматривание строки как такой, которая содержит некий валидный текст в кодировке, отличной от Юникода, почти всегда является ошибкой.
Далее, набор символов, поддерживаемых Юникодом (одним из недостатков Юникода является то, что один термин используется для разных вещей, включая кодировки и схемы кодировок символов), превышает 65536 символов. А это значит, что один char (System.Char) не может содержать любой символ Юникода. А это приводит к понятию суррогатных пар, где символы с кодом выше U+FFFF представляются в виде двух символов. По сути, строки в .NET используют кодировку UTF-16. Возможно, большинству разработчиков и не нужно углубляться касательно этого в детали, но по крайней мере это стоит знать.
Региональные и интернациональные странности
Некоторые странности в Юникоде ведут к странностям при работе со строками и символами. Большинство строковых методов зависимы от региональных настроек (являются culture-sensitive — регионально-чувствительными), — другими словами, работа методов зависит от региональных настроек потока, в котором эти методы выполняются. Например, как вы думаете, что возвратит этот метод «i».toUpper() ? Большинство скажут: «I», а вот и нет! Для турецких региональных настроек метод вернёт «İ» (код U+0130, описание символа: «Latin capital I with dot above»). Для выполнения регионально-независимой смены регистра вы можете использовать свойство CultureInfo.InvariantCulture и передать его как параметр в перегруженную версию метода String.ToUpper , которая принимает CultureInfo .
Есть и другие странности, связанные со сравнением и сортировкой строк, а также с нахождением индекса подстроки в строке. Некоторые из этих операций регионально-зависимы, а некоторые — нет. Например, для всех регионов (насколько я могу видеть) литералы «lassen» и «la\u00dfen» (во втором литерале шестнадцатеричным кодом указан символ «S острое» или «эсце́т») определяются как равные при передачи их в методы CompareTo или Compare , но вот если передать их в Equals , то будет определено неравенство. Метод IndexOf будет учитывать эсцет как «ss» (двойное «s»), но вот если вы используете одну из перегрузок CompareInfo.IndexOf , где укажете CompareOptions.Ordinal , то эсцет будет обработан правильно.
Некоторые символы Юникода вообще абсолютно невидимы для стандартного метода IndexOf . Однажды кто-то спросил в группе новостей C#, почему метод поиска и замены уходит в бесконечный цикл. Этот человек использовал метод Replace для замены всех сдвоенных пробелов одним, а потом проверял, окончилась ли замена и нет ли больше сдвоенных пробелов в строке, используя IndexOf . Если IndexOf показывал, что сдвоенные пробелы есть, строка снова отправлялась на обработку к Replace . К сожалению, всё это «ломалось», так как в строке присутствовал некий «неправильный» символ, расположенный точно между двумя пробелами. IndexOf сообщал о присутствии сдвоенного пробела, игнорируя этот символ, а Replace не выполнял замену, так как «видел» символ. Я так и не узнал, что это был за символ, но подобная ситуация легко воспроизводится при помощи символа U+200C, который является «не-связующим символом нулевой ширины» (англ. zero-width non-joiner character), что бы это не значило, чёрт возьми! Поместите такой или ему подобный в вашу строку, и IndexOf будет его игнорировать, а Replace — нет. Снова-таки, чтобы заставить оба метода работать одинаково, вы можете использовать CompareInfo.IndexOf и указать ему CompareOptions.Ordinal . Мне кажется, что уже написано достаточно много кода, который будет «валиться» на таких «неудобных» данных. И я даже не намекаю, что мой собственный код застрахован от подобного.
Microsoft опубликовала некоторые рекомендации касательно обработки строк, и хотя они датируются 2005-м годом, их всё ещё сто́ит прочесть.
C#. Урок 5. Работа со строками
Тема работы со строками является одной из значимых при изучении любого языка программирования. В приведенном материале будут рассмотрены как базовые концепции работы со строками, так и расширенные возможности, предоставляемые C#.
Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.
Знакомство со строками в C#
За представление строк в C# отвечает класс System . String . В коде, для объявления переменной соответствующего типа, предпочтительно использовать следующий вариант написания: string – с маленькой буквы. Это ключевое слово языка, используя которое можно объявлять строковые переменные, также как int является псевдонимом для System.Int32 , а bool – для System.Boolean .
Допустимо объявление строковых переменных через ключевое слово var :
Для объединения строк используется оператор +:
При работе со String следует помнить, что при переопределении значения переменной создается новый экземпляр строковой переменной в памяти. Поэтому, если вам нужно собрать строку из большого количества составляющих, то использование оператора + не самый лучший вариант. В этом случае будет происходить перерасход памяти: при выполнении операции объединения с присваиванием для очень большого количества подстрок, приложение может аварийно завершиться из-за того, что сборщик мусора не будет успевать удалять неиспользуемые объекты, а новые будут продолжать появляться с большой скоростью. Для решения этой задачи используйте StringBuilder , о нем будет рассказано в конце этого урока.
Создание и инициализация объекта класса String
Существует несколько способов создать объект класса String и проинициализировать его. Рассмотрим варианты, которые доступны в C# . Наиболее распространенный способ сделать эту операцию – это присвоить строковое значение переменной без явного вызова конструктора, так, как мы это делали в предыдущем разделе:
Для дословного представления строки, для того чтобы проигнорировать управляющие последовательности, используйте префикс @ перед значением. Сравните вывод следующей конструкции:
Если требуется подготовить строковое значение с использованием набора переменных, то можно воспользоваться статическим методом Format класса String , либо префиксом $ :
Можно явно вызвать конструктор типа c передачей в него параметров. Самый простой вариант – это передать строку:
В качестве параметра может выступать массив Char элементов:
Ещё вариант – это указать элемент типа char и количество раз, которое его нужно повторить:
Для создания строки также можно использовать указатели на Char* и SByte* , но в данном уроке эта тема рассматриваться не будет.
Базовый API для работы со строками
В рамках данного раздела рассмотрим наиболее интересные и полезные методы и свойства класса String .
Объединение строк. Оператор +, методы Concat и Join
Сцеплять строки между собой можно с помощью оператора + , при этом, в результате объединения, будет создан новый объект:
В составе API , который предоставляет System . String , есть метод Concat , который может выполнять ту же работу:
Метод Concat позволяет объединить до четырех строк через прямое перечисление. Если нужно таким образом объединить больше строковых переменных и значений, то используйте оператор +. Полезным свойством Concat является то, что он может принять на вход массив элементов типа String и объединить их:
Для объединения элементов с указанием разделителя используется метод Join . В предыдущем примере, элементы в массиве sArr1 уже содержали пробел, это не всегда удобно, решим задачу объединения элементов, которые не содержат разделителей, с помощью Join :
В качестве разделителя можно использовать любую строку:
Поиск и извлечение элементов из строки. Оператор [], методы IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny, Substring
Для получения символа из строки с конкретной позиции можно использовать синтаксис подобный тому, что применяется при работе с массивами – через квадратные скобки []:
Для решения обратной задачи: поиск индекса первого (последнего) вхождения элемента или сроки в данной строке используются методы IndexOf , IndexOfAny и LastIndexOf , LastIndexOfAny .
В таблице ниже перечислены некоторые из предоставляемых System . String вариантов этих методов.
IndexOf(Char)
Возвращает индекс первого вхождения символа.
IndexOf(Char, Int32)
Возвращает индекс первого вхождения символа начиная с заданной позиции.
IndexOf(Char, Int32, Int32)
Возвращает индекс первого вхождения символа начиная с заданной позиции, проверяется указанное количество элементов.
IndexOf(String)
IndexOf(String, Int32)
IndexOf(String, Int32, Int32)
Назначение методов совпадает с перечисленными выше, но поиск выполняется для строки.
IndexOfAny(Char[])
IndexOfAny(Char[], Int32)
IndexOfAny(Char[], Int32, Int32)
Назначение методов совпадает с перечисленными выше, но выполняется поиск индекса первого вхождения любого из переданных в массиве элементов.
Last IndexOf([Char | String])
Last IndexOf ( [Char | String], Int32)
Last IndexOf ( [Char | String], Int32, Int32)
Возвращает индекс последнего вхождения символа или строки. Можно задавать индекс, с которого начинать поиск и количество проверяемых позиций. [Char | String] – означает Char или String
LastIndexOfAny(Char[])
LastIndexOfAny(Char[], Int32)
LastIndexOfAny(Char[], Int32, Int32)
Возвращает индекс последнего вхождения любого из переданных в массиве элементов.Можно задавать индекс с которого начинать поиск и количество проверяемых позиций
Для определения того, содержит ли данная строка указанную подстроку, а также для проверки равенства начала или конца строки заданному значению используйте методы: Contains , StartsWith и EndsWith .
Contains(Char)
Contains(String)
Возвращает True если строка содержит указанный символ или подстроки.
StartsWith(Char)
StartsWith(String)
Возвращает True если строка начинается с заданного символа или подстроки.
EndsWith(Char)
EndsWith(String)
Возвращает True если строка заканчивается на заданный символ или подстроку.
Задачу извлечения подстроки из данной строки решает метод SubString :
Substring(Int32)
Возвращает подстроку начиная с указанной позиции и до конца исходной строки.
Substring(Int32, Int32)
Возвращает подстроку начиная с указанной позиции с заданной длины.
Сравнение срок
Для сравнения строк можно использовать оператор сравнения ==, при этом будут сравниваться значения строковых переменных, а не их ссылки, как это делается для других ссылочных типов.
Для сравнения также можно использовать метод Equals , но это менее удобный вариант:
Модификация срок
Класс String предоставляет довольно большое количество инструментов для изменения строк.
Вставка строки в исходную в заданную позицию осуществляется с помощью метода Insert :
Для приведения строки к заданной длине с выравниванием по левому (правому) краю с заполнением недостающих символов пробелами используются методы PadLeft и PadRight :
Метод Remove удаляет подстроку из исходной строки. Возможны два варианта использования:
Remove(Int32)
Удаляет все символы начиная с заданного и до конца строки.
Remove(Int32, Int32)
Удаляет с указанной позиции заданное число символов.
Замена элементов строки производится с помощью метода Replace . Наиболее часто используемые варианты – это замена символа на символ и строки на подстроку:
Для преобразования строки к верхнему регистру используйте метод ToUpper() , к нижнему – ToLower() :
За удаление начальных и конечных символов отвечают методы, начинающиеся на Trim (см. таблицу ниже).
Удаляет символы пробелы из начала и конца строки.
Удаляет экземпляры символа из начала и конца строки.
Удаляет экземпляры символов из начала и конца строки.
TrimStart()
TrimStart(Char)
TrimStart(Char[])
Удаляет экземпляры символов из начала строки.
TrimEnd()
TrimEnd(Char)
TrimEnd(Char[])
Удаляет экземпляры символов из конца строки.
Методы и свойства общего назначения
Рассмотрим некоторые из полезных методов и свойств, которые не вошли в приведенные выше группы.
System.Length – возвращает длину строки:
System.Split() – разделяет заданную строку на подстроки, в качестве разделителя используется указанный через параметр символ (или группа символов):
System.Empty – возвращает пустую строку.
Форматирование строк
Под форматированием строк, в рамках данного раздела, понимается встраивание в строку различных элементом (число, дата и т.п.), представленных в заданном формате. Форматирование можно осуществлять с помощью метода ToString с передачей в него нужных описателей, метода Format , который, в качестве аргументов, получает строку со специальными вставками, определяющими представление элементов и непосредственно сами элементы.
Для начала рассмотрим на нескольких примерах работу с этими методоми:
Эта функциональность также доступна для методов StringBuilder . AppendFormat , TextWriter . WriteLine , Debug . WriteLine , методов из Trace , которые выводят текстовые сообщения, например: Trace . TraceError и метод TraceSource . TraceInformation .
Каждый элемент форматирования представляется следующим образом:
где index – это индекс элемента, которым будет замещена данная конструкция;
alignment – выравнивание;
formatString – формат.
Ниже приведены примеры использования элементов форматирования:
Представление чисел
Для представления чисел используются следующие описатели формата (список не полный, более детальную информацию можете найти в официальной документации):
TEXT() не читает string
Неправильно читает в string значение DATETIME
Здраствуйте, есть БД MySQL в которой в колонке date есть запись 2015-05-28 19:44:15. Когда я с С#.
Cannot convert string to Unity.Engine.Ui.Text
Я новичок, помогите найти ошибку using System.Collections; using UnityEngine; using.
Преобразовать textBox->Text в double и обратно в string
Подскажите люди пожалуйста, как проделать операцию по смене знака на отрицательный, а затем вывести.
Сообщение от kazrulit
А что это за конструкция? А еще есть циклы и каждому символу соответствует свой код.
В какой хоть строке ошибка?
Использую конструкцию которую мне подсказали выше.
Кстати, можно спросить, что такое TEXT()?
Я смотрел: TEXT(%1) = %1.
Сообщение от kazrulit
Subgrando сам незнаю посмотрел пример в MSDN насчет NetShareAdd.
ValeryS исполняется до буквы Z. т.е в алфовитном порядке.
a,b,c,d,e,f,g. z.
Сообщение от kazrulit
The double-number-sign or "token-pasting" operator (##), which is sometimes called the "merging" operator, is used in both object-like and function-like macros. It permits separate tokens to be joined into a single token and therefore cannot be the first or last token in the macro definition.
If a formal parameter in a macro definition is preceded or followed by the token-pasting operator, the formal parameter is immediately replaced by the unexpanded actual argument. Macro expansion is not performed on the argument prior to replacement.
Then, each occurrence of the token-pasting operator in token-string is removed, and the tokens preceding and following it are concatenated. The resulting token must be a valid token. If it is, the token is scanned for possible replacement if it represents a macro name. The identifier represents the name by which the concatenated tokens will be known in the program before replacement. Each token represents a token defined elsewhere, either within the program or on the compiler command line. White space preceding or following the operator is optional.
This example illustrates use of both the stringizing and token-pasting operators in specifying program output:
Copy Code
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;