Похожая тема Строковые массивы типа string в c#
В первых языках программирования строковому типу уделялось гораздо меньше внимания, чем арифметическому типу или массивам. Поэтому в разных языках строки представлены по-разному и стандарт на строковый тип сложился относительно недавно. Когда говорят о строковом типе, то обычно различают тип, представляющий:
- отдельные символы, чаще всего, его называют типом char;
- строки постоянной длины, часто они представляются массивом символов;
- строки переменной длины – это, как правило, тип string, соответствующий современному представлению о строковом типе.
Символьный тип char, представляющий частный случай строк длиной в 1 символ, полезен во многих задачах. Основные операции над строками – это разбор и сборка. При их выполнении приходится, чаще всего, доходить до каждого символа строки. При таком подходе получение i-го символа строки становится такой же простой операцией, как и получение i-го элемента массива. Следовательно, эффективно реализуются обычные операции над строками – определение вхождения одной строки в другую, выделение подстроки, замена символов строки. Однако заметьте, представление строки массивом символов хорошо только для строк постоянной длины. Массив не приспособлен к изменению его размеров, вставки или удалению символов (подстрок). Наиболее часто используемым строковым типом является тип, обычно называемый string, который задаёт строки переменной длины. Над этим типом допускаются операции поиска вхождения одной строки в другую, операции вставки, замены и удаления подстрок.
1) Класс Char:
В C# есть символьный класс Char, основанный на классе System.Char и использующий двухбайтную кодировку Unicode представления символов. Для этого типа в языке определены символьные константы (символьные литералы). Константу можно задавать:
- символом, заключенным в одинарные кавычки;
- escape-последовательностью, задающей код символа;
- Unicode-последовательностью, задающей Unicode-код символа.
Вот несколько примеров объявления символьных переменных и работы с ними:
// обычный символ, обычная последовательность, Unicode-последовательность
char ch1 = 'A';
// обычная ESC-последовательность – код символа Z
char ch2 = '\x5A';
// Unicode-последовательность – код символа X
char ch3 = '\u0058';
// объявление в объектном стиле в динамической памяти
char ch = new Char();
// присваивание по правилам присваивания
// значения ссылочному типу
ch = ch1; // значение ‘A’
// неявное преобразование символьного типа в тип int
int code;
code = ch; // в code – значение 65
// явное преобразование – в ch1 будет значение ‘B’
ch1 = (char)(code +1);
// преобразование символьного типа в строку
string s;
// s = ch; // это некорректно – разные типы
// преобразование типов – в строке будет значение BZX
s = ch1.ToString() + ch2.ToString() + ch3.ToString();
У класса Char имеется ряд свойств и статических методов:

Методы в основном перегружены. Это значит, что они могут применяться как к отдельному символу, так и к отдельному символу строки. Основную группу составляют методы Is, крайне полезные при разборе строки. Вот примеры, в которых используются многие из перечисленных методов:
Console.WriteLine("Статические методы класса char:");
char ch = 'a', ch1 = '1', lim = ';', chc = '\xA';
double d1, d2;
d1 = char.GetNumericValue(ch);
d2 = char.GetNumericValue(ch1);
Console.WriteLine("Метод GetNumericValue:");
Console.WriteLine("sym 'a' - value {0}", d1);
Console.WriteLine("sym '1' - value {0}", d2);
System.Globalization.UnicodeCategory cat1, cat2;
cat1 = char.GetUnicodeCategory(ch1);
cat2 = char.GetUnicodeCategory(lim);
Console.WriteLine("Метод GetUnicodeCategory:");
Console.WriteLine("sym '1' - category {0}", cat1);
Console.WriteLine("sym ';' - category {0}", cat2);
Console.WriteLine("Метод IsControl:");
Console.WriteLine("sym '\xA' - IsControl - {0}",
char.IsControl(chc));
Console.WriteLine("sym ';' - IsControl - {0}",
char.IsControl(lim));
Console.WriteLine("Метод IsSeparator:");
Console.WriteLine("sym ' ' - IsSeparator - {0}",
char.IsSeparator(' '));
Console.WriteLine("sym ';' - IsSeparator - {0}",
char.IsSeparator(lim));
Console.WriteLine("Метод IsSurrogate:");
Console.WriteLine("sym '\u10FF' - IsSurrogate - {0}",
char.IsSurrogate('\u10FF'));
Console.WriteLine("sym '\\' - IsSurrogate - {0}",
char.IsSurrogate('\\'));
string str = "\U00010F00";
// Символы Unicode в интервале [0x10000,0x10FFF]
// представляются двумя 16-битными
//суррогатными символами
Console.WriteLine("str = {0}, str[0] = {1}",
str, str[0]);
Console.WriteLine("str[0] IsSurrogate - {0}",
char.IsSurrogate(str, 0));
Console.WriteLine("Метод IsWhiteSpace:");
str ="пробелы, пробелы!" + "\xD" + "\xA" +
"Всюду пробелы!";
Console.WriteLine("sym '\xD ' - IsWhiteSpace - {0}",
char.IsWhiteSpace('\xD'));
Console.WriteLine("str: {0}", str);
Console.WriteLine("и ее пробелы - символ 8 {0}," +
"символ 17 {1}",
char.IsWhiteSpace(str,8),
char.IsWhiteSpace(str,17));
Console.WriteLine("Метод Parse:");
str ="A";
ch = char.Parse(str);
Console.WriteLine("str:{0} char: {1}",str, ch);
Console.WriteLine("Минимальное и максимальное " +
"значение: {0}, {1}",
char.MinValue.ToString(),
char.MaxValue.ToString());
Console.WriteLine("Их коды: {0}, {1}",
SayCode(char.MinValue), SayCode(char.MaxValue));
Результаты консольного вывода, порождённого выполнением метода, изображены ниже.

Кроме статических методов, у класса Char есть и динамические. Большинство из них - это методы родительского класса Object, унаследованные и переопределённые в классе Char. Из собственных динамических методов стоит отметить метод CompareTo, позволяющий проводить сравнение символов. Он выдаёт для несовпадающих символов "расстояние" между символами в соответствии с их упорядоченностью в кодировке Unicode. Вот пример:
char ch1, ch2;
int dif;
Console.WriteLine("Метод CompareTo");
ch1 = 'A';
ch2 = 'Z';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},"
+ " {1} = {2}", ch1, ch2, dif);
ch1 = 'а';
ch2 = 'А';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},"
+ " {1} = {2}", ch1, ch2, dif);
ch1 = 'Я';
ch2 = 'А';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},"
+ "{1} = {2}", ch1, ch2, dif);
ch1 = 'A';
ch2 = 'A';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},"
+ " {1} = {2}", ch1, ch2, dif);
ch1 = 'А';
ch2 = 'A';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},"
+ " {1} = {2}", ch1, ch2, dif);
ch1 = 'Ё';
ch2 = 'А';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},"
+ " {1} = {2}", ch1, ch2, dif);
Результаты сравнения – ниже.

Анализируя эти результаты, можно понять, что в кодировке Unicode как латиница, так и кириллица плотно упакованы. Исключение составляет буква Ё - заглавная и малая – они выпадают из плотной кодировки. Малые буквы в кодировке непосредственно следуют за заглавными буквами. Расстояние между алфавитами в кодировке довольно большое – русская буква А на 975 символов правее в кодировке, чем соответствующая буква в латинском алфавите.
2) Класс Char []:
В языке C# определен класс Char[], и его можно использовать для представления строк постоянной длины. Вместе с тем, массив char[] – это обычный массив. Более того, его нельзя инициализировать строкой символов. Константа, задающая строку символов, принадлежит классу String, а в C# не определены взаимные преобразования между классами String и Char[], даже явные. У класса String есть, правда, динамический метод ToCharArray, задающий подобное преобразование. Возможно также посимвольно передать содержимое переменной string в массив символов. Вот пример:
// ошибка: нет преобразования класса string в класс char[]
// char[] strM1 = "Привет посетителям сайта!";
// а надо так:
string hello = "Привет посетителям сайта!";
char[] strM1 = hello.ToCharArray();
// вывод на экран посимвольно
for(int i = 0; i < strM1.Length; i++)
Console.Write(strM1[i]);
Console.WriteLine();
// копирование подстроки методом класса Array
char[] World = new char[3];
Array.Copy(strM1,12,World,0,3);
// вывод массива с преобразованием в строку
Console.WriteLine(CharArrayToString(World));
Метод ToCharArray позволяет преобразовать строку в массив символов. К сожалению, обратная операция не определена, поскольку метод ToString, которым, конечно же, обладают все объекты класса Char[], печатает информацию о классе, а не содержимое массива. Ситуацию легко исправить, написав соответствующий цикл. Например:
string result = "";
for(int i = 0; i < strM1.Length; i++)
result = result + strM1[i];
return(result);
Класс Char[], как и всякий класс-массив в C#, является наследником не только класса Object, но и класса Array, и, следовательно, обладает всеми методами родительских классов.