Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 17

for (int i = a.GetLowerBound(0); i <= a.GetUpperBound(0); i++, Console.WriteLine())

  for (int j = a.GetLowerBound(1); j <= a.GetUpperBound(1); j++, Console.WriteLine())

    for (int k = a.GetLowerBound(2); k <= a.GetUpperBound(2); k++)

      Console.Write("a[{0}][{1}][{2}] = {3}",i,j,k, a.GetValue(new int[] { i, j, k }) + ",  ");

Если вам трудно воспринять то, что вы видите, не расстраивайтесь, так как в этой стране еще не скоро возродится интерес к дифференциальным уравнениям. В 1991 коммунисты с менталитетом сапожника, а затем и торгаши с менталитетом бандитов позаботились об этом.

Другие методы класса Array

Все массивы поддержаны классом System.Array. Какими методами этого класса мы можем пользоваться при манипулировании объектами массива men? Оказывается, далеко не всеми, так как наш класс Man еще не достаточно развит. Но некоторые методы мы уже можем применять. При выполнении следующих заданий не выбрасывайте класс Helper, пусть он всегда будет с вами. Сейчас мы создадим массив ссылок на объекты класса Man и применим к нему следующие методы:

·  IndexOf — возвращает индекс первого искомого элемента в массиве;

·  LastIndexOf — возвращает индекс последнего искомого элемента в массиве;

·  Reverse — реверсирует (переворачивает) массив;

·  Copy — копируeт подпоследовательность.

Добавьте в проект файл TestManArray и вызовите его в ветви 'm'. Здесь мы быстро создадим испытуемый массив.

Man  // Три ссылки на отдельные объекты

  ken = new Man ("Ken Wood",40),

  len = new Man ("Lennie Tristano",50),

  ben = new Man ("Ben Webster",60);

Man[] men = { ken, len, ben, ken, len, ben }; // Массив ссылок на объекты

   //===== Вставьте код поиска первого вхождения Lennie Tristano

Console.WriteLine("The first Lennie's id = {0}",id);

   //===== Вставьте код поиска последнего вхождения

Console.WriteLine("The last Lennie's id = {0}",id);

 //===== Вставьте код реверса последовательности

Console.WriteLine("\nAfter Reverse:\n");

foreach (Man m in men)

  m.Out();

//===== Вставьте код реверса последовательности

Console.WriteLine("\nAfter Reverse:\n");

foreach (Man m in men)

  m.Out();

//===== Копирование подпоследовательности (Вставьте коды вызова метода Copy и вывода всей копии)

Console.WriteLine("\nAfter Copy:\n");

Подсказки. Вставьте код поиска объекта len в массиве men. Мы реверсируем массив дважды для того, чтобы правильно работал фрагмент проверки равенства ссылок, который мы вставим позже. Перед тем, как использовать статический метод Copy, захватите память для массива-мишени. Выведите массив — мишень операции копирования.

Равенство ссылок и равенство объектов

Метод Equals существует во всех классах. Он существует и в классе Array и в классе Man, хотя мы не создавали его (объясните это). В следующем фрагменте мы воспользуемся методом Equals класса Man.

//===== Проверка равенства ссылок (?)  Объясните все результаты сравнений !!

Console.WriteLine("ken.Equals(men[0]) = {0}", ken.Equals(men[0]));

Console.WriteLine("men[0].Equals(men[3]) = {0}", men[0].Equals(men[3]));

ken = new Man("Ken Wood", 40);

Console.WriteLine("ken.Equals(men[0]) = {0}", ken.Equals(men[0]));

Console.WriteLine("men[0].Equals(men[3]) = {0}", men[0].Equals(men[3]));

Метод Equals возвращает булевский результат проверки равенства двух ссылок на объекты и в нашем случае он дает осмысленные результаты, но если копнуть глубже, то мы увидим, что он работает не так, как было бы естественно предположить. Логичны ли все выведенные результаты? Почему они такие? Переопределите метод Equals в классе Man так, чтобы он проверял равенство сущностей, а не равенство адресов. После этого вновь проверьте результаты сравнений.

Чтобы выправить ситуацию, следует переопределить в классе Man виртуальную функцию Equals, доставшуюся в наследство от класса Object. Рекомендую сделать это с помощью механизма Intellisense. Нчните набирать public override, затем введите пробел и выберите строку Equals.