Суббота, 23.11.2024, 02:27
Приветствую Вас Гость | RSS
Меню сайта
Категории раздела
База языка C# [3]
В данном разделе будут статьи по базовым понятиям языка C#
Основы языка С# [22]
Раздел продолжает рассматривать основы языка C#
Задачи [2]
примеры решения задач
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Главная » Статьи » C# » Основы языка С#

Строковый тип string

Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Ему соответствует базовый тип класса System.String библиотеки .Net. Тип string относится к ссылочным типам.
Существенной особенностью данного класса является то, что каждый его объект – это неизменяемая (immutable) последовательность символов Unicode. Любое действие со строкой ведет к тому, что создается копия строки, в которой и выполняются все изменения. Исходная же строка не меняется. Такой подход к работе со строками может показаться странным, но он обусловлен необходимостью сделать работу со строками максимально быстрой и безопасной. Например, при наличии нескольких одинаковых строк CLR может хранить их по одному и тому же адресу (данный механизм называется stringinterning), экономя таким образом память.
Создать объект типа string можно несколькими способами:
1) string s; // инициализация отложена
2) string s=''кол около колокола''; //инициализация строковым литералом
3) string s=@''Привет!
Сегодня хорошая погода!!!''
//символ @ сообщает конструктору string, что строку
// нужно воспринимать буквально, даже
// если она занимает несколько строк
4) int x = 12344556; //инициализировали целочисленную переменную
string s=x.ToString(); //преобразовали ее к типу string
5) string s=new string (' ', 20); //конструктор создает строку из 20 пробелов
6) char [] a={'a', 'b', 'c', 'd', 'e'}; //создали массив символов
string v=new string (a); //создание строки из массива символов
7) char [] a={'a', 'b', 'c', 'd', 'e'};
string v=new string (a, 0, 2);
// создание строки из части массива символов, при
// этом: 0 показывает с какого символа, 2 – сколько
// символов использовать для инициализации
Замечание. В примерах 1-4 используется неявный вызов конструктора. В примерах 5-7 конструктор вызывается явным образом через использование операции new.
С объектом типа string можно работать посимвольно, т.е поэлементно:

static void Main()

{

    string a = "кол около колокола";

    Console.WriteLine("Дана строка: {0}", a);

    char b = 'о';

    int k = 0;

    for (int x = 0; x < a.Length; x++)

    {

        if (a[x] == b)

        {

            k++;

        }

    }

    Console.WriteLine("Символ {0} содержится в ней {1} раз", b, k);

}

Результат работы программы:
Дана строка: кол около колокола
Символ о содержится в ней 7 раз
Однако при попытке заменить в данной строке все вхождения буквы о на букву а, ожидаемого результата мы не получим:

for (int x = 0; x < a.Length; x++)

{

    if (a[x] == b)

    {

        a[x] = c; //1

    }

}

Относительно строки 1 компилятор выдаст сообщение об ошибке:
Property or indexer string.this[int] cannot be assigned to – it is read only
Тем самым компилятор запрещает напрямую изменять значение строки.
Класс string обладает богатым набором методов для сравнения строк, поиска в строке и других действий со строками. Рассмотрим эти методы.

Название Вид Описание
Compare Статический метод Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки с учетом или без учета регистра.
CompareTo Экземплярный метод Сравнение текущего экземпляра строки с другой строкой.
Concat Статический метод Слияние произвольного числа строк.
Copy Статический метод Создание копии строки.
Empty Статическое поле Открытое статическое поле, представляющее пустую строку.
Format Статический метод Форматирование строки в соответствии с заданным форматом.
IndexOf, LastIndexOf Экземплярные методы Определение индекса первого или, соответственно, последнего вхождения подстроки в данной строке.
IndexOfAny,
LastIndexOfAny
Экземплярные методы Определение индекса первого или, соответственно, последнего вхождения любого символа из подстроки в данной строке.
Insert Экземплярный метод Вставка подстроки в заданную позицию.
Join Статический метод Слияние массива строк в единую строку. Между элементами массива вставляются разделители.
Length Свойство Возвращает длину строки.
PadLeft, PadRigth Экземплярные методы Выравнивают строки по левому или, соответственно, правому краю путем вставки нужного числа пробелов в начале или в конце строки.
Remove Экземплярный метод Удаление подстроки из заданной позиции.
Replace Экземплярный метод Замена всех вхождений заданной подстроки или символа новыми подстрокой или символом.
Split Экземплярный метод Разделяет строку на элементы, используя разные разделители. Результаты помещаются в массив строк.
StartWith, EndWith Экземплярные методы Возвращают true или false в зависимости от того, начинается или заканчивается строка заданной подстрокой.
Substring Экземплярный метод Выделение подстроки, начиная с заданной позиции.
ToCharArray Экземплярный метод Преобразует строку в массив символов.
ToLower, ToUpper Экземплярные методы Преобразование строки к нижнему или, соответственно, к верхнему регистру.
Trim, TrimStart, TrimEnd Экземплярные методы Удаление пробелов в начале и конце строки или только с начала или только с конца соответственно.

Замечание. Напоминаем, что вызов статических методов происходит через обращение к имени класса, например, String.Concat(str1, str2), а обращение к экземплярым методам через объекты (экземпляры класса), например, str.ToLower().
Обратите внимание на то, что все методы возвращают ссылку на новую строку, созданную в результате преобразования копии исходной строки. Для того чтобы сохранить данное преобразование, нужно установить на него новую ссылку. Например, если выполнить следующий фрагмент программы:

string a = "кол около колокола";

Console.WriteLine("Строка а: {0}", a);

a.Remove(0, 4);

Console.WriteLine("Строка a: {0}", a);

Результат работы программы:
Cтрока a: кол около колокола
Cтрока a: кол около колокола
то компилятор никаких сообщений не выдаст, но мы не увидим никаких преобразований со строкой.
А вот в результате работы следующего фрагмента программы мы получим следующий результат:

string a = "кол около колокола";

Console.WriteLine("Cтрока a: {0}", a);

string b = a.Remove(0, 4);

Console.WriteLine("Cтрока a: {0}", a);

Console.WriteLine("Cтрока b: {0}", b);

Результат работы программы:
Строка а: кол около колокола
Строка а: кол около колокола
Строка b: около колокола
Результат выполнения метода Remove, можно записать и в саму переменную a:

string a = "кол около колокола";

Console.WriteLine("Cтрока a: {0}", a);

a = a.Remove(0, 4);

Console.WriteLine("Cтрока a: {0}", a);

Результат работы программы:
Строка а: кол около колокола
Строка а: около колокола
В этом случае будет потеряна ссылка на исходное строковое значение "кол около колокола", хотя оно и будет занимать память. Освободить занятую память сможет только сборщик мусора.
Рассмотрим следующий фрагмент программы:

string a = "";

for (int i = 1; i <= 100; i++)

{

    a += "!";

}

Console.WriteLine(a);

В этом случае в памяти компьютера будет сформировано 100 различных строк вида:
!
!!
!!!

!!!...!!
И только на последнюю из них будет ссылаться переменная а. Ссылки на все остальные строчки будут потеряны, но как и в предыдущем примере эти строки будут храниться в памяти компьютера и засорять ее. Боротся с таким засорением придется сборщику мусора, что будет сказываться на производительности программы.

 

Категория: Основы языка С# | Добавил: solowey (20.01.2016)
Просмотров: 224 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт