"Сокрытие деталей реализации называется инкапсуляцией (от слова "капсула"). " Сколько можно объяснять?! ИНКАПСУЛЯЦИЯ НЕ РАВНА СОКРЫТИЮ!!! Инкапсуляция это парадигма ООП, которая ОБЕСПЕЧИВАЕТ СОКРЫТИЕ!!! НО СОКРЫТИЕМ НЕ ЯВЛЯЕТСЯ!!! Если буровая коронка обеспечивает разрушение породы, то является ли она сама разрушением породы? Конечно нет! |
Массивы, символы и строки
Массивы объектов
При создании массива, состоящего из элементов ссылочного типа, память выделяется только под ссылки на элементы, а сами элементы необходимо разместить в хипе явным образом. В качестве примера создадим массив из объектов некоторого класса 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: ароза упал ан алапу азор а