Тверской государственный университет
Опубликован: 22.11.2005 | Доступ: свободный | Студентов: 30397 / 1843 | Оценка: 4.31 / 3.69 | Длительность: 28:26:00
ISBN: 978-5-9556-0050-5
Лекция 13:

Символы и строки постоянной длины в C#

< Лекция 12 || Лекция 13: 1234 || Лекция 14 >

Класс Char, как и все классы в C#, наследует свойства и методы родительского класса Object. Но у него есть и собственные методы и свойства, и их немало. Сводка этих методов приведена в таблице 13.1.

Большинство статических методов перегружены. Они могут применяться как к отдельному символу, так и к строке, для которой указывается номер символа для применения метода. Основную группу составляют методы Is, крайне полезные при разборе строки. Приведу примеры, в которых используются многие из перечисленных методов:

public void TestCharMethods()
{
	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)); 
}//TestCharMethods

Результаты консольного вывода, порожденного выполнением метода, изображены на рис. 13.1.

Вызовы статических методов класса char

Рис. 13.1. Вызовы статических методов класса char

Кроме статических методов, у класса Char есть и динамические. Большинство из них - это методы родительского класса Object, унаследованные и переопределенные в классе Char. Из собственных динамических методов стоит отметить метод CompareTo, позволяющий проводить сравнение символов. Он отличается от метода Equal тем, что для несовпадающих символов выдает "расстояние" между символами в соответствии с их упорядоченностью в кодировке Unicode. Приведу пример:

public void testCompareChars()
{
	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);
}//TestCompareChars

Результаты сравнения изображены на рис. 13.2.

Сравнение символов

Рис. 13.2. Сравнение символов

Анализируя эти результаты, можно понять, что в кодировке Unicode как латиница, так и кириллица плотно упакованы. Исключение составляет буква Ё - заглавная и малая - они выпадают из плотной кодировки. Малые буквы в кодировке непосредственно следуют за заглавными буквами. Расстояние между алфавитами в кодировке довольно большое - русская буква А на 975 символов правее в кодировке, чем соответствующая буква в латинском алфавите.

< Лекция 12 || Лекция 13: 1234 || Лекция 14 >
Александр Галабудник
Александр Галабудник

Не обнаружил проекты, которые используются в примерах в лекции, также не увидел список задач.

Александра Гусева
Александра Гусева