Строки и класс System.String

В языке C# строковые значения представляет тип string, а вся функциональность работы с данным типом сосредоточена в классе System.String. Собственно string является псевдонимом для класса System.String. Объекты этого класса представляют текст как последовательность символов Unicode. Максимальный размер объекта String может составлять в памяти 2 ГБ, или около 1 миллиарда символов.

Создавать строки можно, как используя переменную типа string и присваивая ей значение, так и применяя один из конструкторов класса String:

string s1 = "hello";

string s2 = null;

Используя свойство Length, как и в обычном массиве, можно получить длину строки.

Основные методы строк

Основная функциональность класса String раскрывается через его методы, среди которых можно выделить следующие:

Compare: сравнивает две строки с учетом текущей культуры (локали) пользователя

CompareOrdinal: сравнивает две строки без учета локали

Contains: определяет, содержится ли подстрока в строке

Concat: соединяет строки

CopyTo: копирует часть строки или всю строку в другую строку

EndsWith: определяет, совпадает ли конец строки с подстрокой

Format: форматирует строку

IndexOf: находит индекс первого вхождения символа или подстроки в строке

Insert: вставляет в строку подстроку

Join: соединяет элементы массива строк

LastIndexOf: находит индекс последнего вхождения символа или подстроки в строке

Replace: замещает в строке символ или подстроку другим символом или подстрокой

Split: разделяет одну строку на массив строк

Substring: извлекает из строки подстроку, начиная с указанной позиции

ToLower: переводит все символы строки в нижний регистр

ToUpper: переводит все символы строки в верхний регистр

Trim: удаляет начальные и конечные пробелы из строки

Операции со строками

Конкатенация строк или объединение может производиться как с помощью операции +, так и с помощью метода Concat:

string s1 = "hello";

string s2 = "world";

string s3 = s1 + " " + s2; // результат: строка "hello world"

string s4 = String.Concat(s3, "!!!"); // результат: строка "hello world!!!"

Console.WriteLine(s4);

Для сравнения строк применяется статический метод Compare [4]:

string s1 = "hello";

string s2 = "world";

int result = String.Compare(s1, s2);

if (result<0)

{ Console.WriteLine("Строка s1 перед строкой s2");}

else if (result > 0)

{ Console.WriteLine("Строка s1 стоит после строки s2");}

else

{ Console.WriteLine("Строки s1 и s2 идентичны"); }

// результатом будет "Строка s1 перед строкой s2"

Поиск в строке

С помощью метода IndexOf мы можем определить индекс первого вхождения отдельного символа или подстроки в строке [4]:

string s1 = "hello world";

char ch = 'o';

int indexOfChar = s1.IndexOf(ch); // равно 4

Console.WriteLine(indexOfChar);

string subString = "wor";

int indexOfSubstring = s1.IndexOf(subString); // равно 6

Console.WriteLine(indexOfSubstring);

Подобным образом действует метод LastIndexOf, только находит индекс последнего вхождения символа или подстроки в строку.

Разделение строк

С помощью функции Split мы можем разделить строку на массив подстрок. В качестве параметра функция Split принимает массив символов или строк, которые и будут служить разделителями. Например, подсчитаем количество слов в сроке, разделив ее по пробельным символам:

string text = "И поэтому все так произошло";

string[] words = text.Split(new char[] { ' ' });

foreach (string s in words)

{ Console.WriteLine(s); }

Для обрезки начальных или концевых символов используется функция Trim:

string text = " hello world ";

text = text.Trim(); // результат "hello world"

text = text.Trim(new char[] { 'd', 'h' }); // результат "ello worl"

Для вставки одной строки в другую применяется функция Insert:

string text = "Хороший день";

string subString = "замечательный ";

text = text.Insert(8, subString);

Console.WriteLine(text);

Удалить часть строки помогает метод Remove [4]:

Чтобы заменить один символ или подстроку на другую, применяется метод Replace:

Форматирование

При выводе строк в консоли с помощью метода Console.WriteLine мы можем применять форматирование вместо конкатенации:

class Program

{

static void Main(string[] args)

{

Person person = new Person { Name = "Tom", Age = 23 };

Console.WriteLine("Имя: {0} Возраст: {1}", person.Name, person.Age);

Console.Read();

}

}

class Person

{

public string Name { get; set; }

public int Age { get; set; }

}

В строке "Имя: {0} Возраст: {1}" на место {0} и {1} затем будут вставляться в порядке следования person.Name и person.Age

То же самое мы можем сделать с помощью метода String.Format:

string output = String.Format("Имя: {0} Возраст: {1}", person.Name, person.Age);

Console.WriteLine(output);

Метод Format принимает строку с плейсхолдерами типа {0}, {1} и т.д., а также набор аргументов, которые вставляются на место данных плейсхолдеров. В итоге генерируется новая строка.

В методе Format могут использоваться различные спецификаторы и описатели, которые позволяют настроить вывод данных. Рассмотрим основные описатели.

Все используемые форматы:

С / с - задает формат денежной единицы, указывает количество десятичных разрядов после запятой;

D / d - целочисленный формат, указывает минимальное количество цифр;

E / e - экспоненциальное представление числа, указывает количество десятичных разрядов после запятой;

G / g - задает более короткий из двух форматов: F или E;

F / f - формат дробных чисел с фиксированной точкой, указывает количество десятичных разрядов после запятой;

P / p - также задает формат дробных чисел с фиксированной точкой, определяет количество разрядов после запятой;

X / x - шестнадцатеричный формат числа;

C / c - задает формат денежной единицы, указывает количество десятичных разрядов после запятой;

D / d - Целочисленный формат, указывает минимальное количество цифр

E / e - экспоненциальное представление числа, указывает количество десятичных разрядов после запятой;

F / f - формат дробных чисел с фиксированной точкой, указывает количество десятичных разрядов после запятой;

G / g - задает более короткий из двух форматов: F или E;

N / n - также задает формат дробных чисел с фиксированной точкой, определяет количество разрядов после запятой;

P / p - задает отображения знака процентов рядом с число, указывает количество десятичных разрядов после запятой;

X / x - шестнадцатеричный формат числа.

Для форматирования целочисленных значение применяется описатель "d":

Для форматирования дробных чисел используется описатель F, число после которого указывает, сколько знаков будет использоваться после разделителя между целой и дробной частью. Если исходное число - целое, то к нему добавляются разделитель и нули.

Описатель "P" задает отображение процентов. Используемый с ним числовой спецификатор указывает, сколько знаков будет после запятой:

decimal number = 0.15345m;

Console.WriteLine("{0:P1}", number);// 15.3%

Настраиваемые форматы

Используя знак #, можно настроить формат вывода. Например, нам надо вывести некоторое число в формате телефона +х (ххх)ххх-хх-хх: [4]

long number = 19876543210;

string result = String.Format("{0:+# (###) ###-##-##}", number);

Console.WriteLine(result); // +1 (987) 654-32-10

Имя: Том Возраст: 23

Обработка исключений

При выполнении программы могут возникать ошибки, которые трудно предусмотреть или предвидеть, а иногда и вовсе невозможно. Например, при передачи файла по сети может неожиданно оборваться сетевое подключение. такие ситуации называются исключениями. Язык C# предоставляет разработчикам возможности для обработки таких ситуаций. Для этого в C# предназначена конструкция try...catch...finally.

При возникновении исключения среда CLR ищет блок catch, который может обработать данное исключение. Если такого блока не найдено, то пользователю отображается сообщение о необработанном исключении, а дальнейшее выполнение программы останавливается. И чтобы подобной остановки не произошло, и надо использовать блок try..catch. Например [4]:

static void Main(string[] args)

{

int[] a = new int[4];

try

{

a[5] = 4; // тут возникнет исключение, так как у нас в массиве только 4 элемента

Console.WriteLine("Завершение блока try");

}

catch (Exception ex)

{ Console.WriteLine("Ошибка: " + ex.Message); }

finally

{ Console.WriteLine("Блок finally"); }

Console.ReadLine();

}

При использовании блока try...catch..finally вначале выполняются все инструкции между операторами try и catch. Если между этими операторами вдруг возникает исключение, то обычный порядок выполнения останавливается и переходит к инструкции сatch. В данном случае у нас явно возникнет исключение в блоке try, так как мы пытаемся присвоить значение шестому элементу массива в то время, как в массиве всего 4 элемента. И дойдя до строки a[5] = 4;, выполнение программы остановится и перейдет к блоку catch

Инструкция catch имеет следующий синтаксис: catch (тип_исключения имя_переменной). В нашем случае объявляется переменная ex, которая имеет тип Exception. Но если возникшее исключение не является исключением типа, указанного в инструкции сatch, то оно не обрабатывается, а программа просто зависает или выбрасывает сообщение об ошибке.

Наши рекомендации