Инкапсуляция |
Массивы, символы и строки
Массивы объектов
При создании массива, состоящего из элементов ссылочного типа, память выделяется только под ссылки на элементы, а сами элементы необходимо разместить в хипе явным образом. В качестве примера создадим массив из объектов некоторого класса Monster:
using System; namespace ConsoleApplication1 { class Monster { ... } class Class1 { static void Main() { Random rnd = new Random(); const int n = 5; Monster[] stado = new Monster[n]; // 1 for ( int i = 0; i < n; ++i ) // 2 { stado[i] = new Monster( rnd.Next( 1, 100 ), rnd.Next( 1, 200 ), "Crazy" + i.ToString() ); } foreach ( Monster x in stado ) x.Passport(); // 3 } } }
Результат работы программы:
Monster Crazy0 health = 18 ammo = 94 Monster Crazy1 health = 85 ammo = 75 Monster Crazy2 health = 13 ammo = 6 Monster Crazy3 health = 51 ammo = 104 Monster Crazy4 health = 68 ammo = 114
Пример поиска в массиве объектов приведен в конце следующей лекции.
Символы и строки
Обработка текстовой информации является, вероятно, одной из самых распространенных задач в современном программировании, и C# предоставляет для ее решения широкий набор средств: отдельные символы, массивы символов, изменяемые и неизменяемые строки и регулярные выражения.
Символы
Символьный тип char предназначен для хранения символов в кодировке Unicode. Символьный тип относится к встроенным типам данных C# и соответствует стандартному классу Char библиотеки .NET из пространства имен System. В этом классе определены статические методы, позволяющие задать вид и категорию символа, а также преобразовать символ в верхний или нижний регистр и в число. Некоторые методы приведены в таблилце 6.2, с остальными можно ознакомиться по учебнику [4].
В листинге 6.6 продемонстрировано использование этих методов.
using System; namespace ConsoleApplication1 { class Class1 { static void Main() { try { char b = 'B', c = '\x63', d = '\u0032'; // 1 Console.WriteLine( "{0} {1} {2}", b, c, d ); Console.WriteLine( "{0} {1} {2}", char.ToLower(b), char.ToUpper(c), char.GetNumericValue(d) ); char a; do // 2 { Console.Write( "Введите символ: " ); a = char.Parse( Console.ReadLine() ); Console.WriteLine( "Введен символ {0}, его код – {1}", a, (int)a ); if (char.IsLetter(a)) Console.WriteLine("Буква"); if (char.IsUpper(a)) Console.WriteLine("Верхний рег."); if (char.IsLower(a)) Console.WriteLine("Нижний рег."); if (char.IsControl(a)) Console.WriteLine("Управляющий"); if (char.IsNumber(a)) Console.WriteLine("Число"); if (char.IsPunctuation(a)) Console.WriteLine("Разделитель"); } while (a != 'q'); } catch { Console.WriteLine( "Возникло исключение" ); return; } } } }Листинг 6.6. Использование методов класса System.Char
Массивы символов
Массив символов, как и массив любого иного типа, построен на основе базового класса Array. Применение этих методов позволяет эффективно решать некоторые задачи. Простой пример приведен в листинге 6.7.
using System; namespace ConsoleApplication1 { class Class1 { static void Main() { char[] a = { 'm', 'a', 's', 's', 'i', 'v' }; // 1 char[] b = "а роза упала на лапу азора".ToCharArray(); // 2 PrintArray( "Исходный массив а:", a ); int pos = Array.IndexOf( a, 'm' ); a[pos] = 'M'; PrintArray( "Измененный массив а:", a ); PrintArray( "Исходный массив b:", b ); Array.Reverse( b ); PrintArray( "Измененный массив b:", b ); } public static void PrintArray( string header, Array a ) { Console.WriteLine( header ); foreach ( object x in a ) Console.Write( x ); Console.WriteLine( "\n" ); } } }Листинг 6.7. Работа с массивом символов
Результат работы программы:
Исходный массив а: massiv Измененный массив а: Massiv Исходный массив b: а роза упала на лапу азора Измененный массив b: ароза упал ан алапу азор а