Строки и класс 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, то оно не обрабатывается, а программа просто зависает или выбрасывает сообщение об ошибке.