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

Для проверки нового кода в конец функции Main добавьте следующие строки:

m = new Man ("Avalon Ru", 10); // Используем второй конструктор

m.Out();    m.In();    m.Out();

Следующее (необязательное) задание лучше выполнить дома (в аудитории время слишком ценно). Создайте свой собственный класс и испытайте его поведение. Например, класс плоских многоугольников (Данные: количество вершин, массив координат. Методы: ввести, вывести, переместить, вычислить площадь, определить выпуклый или нет, создать выпуклую оболочку, определить, лежит ли заданная точка внутри, и т.д.)

Класс Stack

Смотрите, как просто создать динамическую коллекцию, работающую по принципу стека на основе линейного односвязного списка, реализованного буквально на лету. Этот пример приводит создатель языка Anders Hejlsberg. Добавьте к проекту новый класс с именем Stack (при этом студия создаст файл Stack.cs) и вставьте (внутрь пространства имен) такой код:

public class Stack

{

#region Class Node (Поставьте фокус сюда и нажмите Ctrl+MM несколько раз)

class Node

{

    public Node Next;

    public object Value;

    public Node(object value): this(value, null) {} // Вызов другого конструктора

    public Node(object value, Node next)

    {

      Next = next;

      Value = value;

    }

}

#endregion

Node top = null; // Вершина стека

public bool IsEmpty() { return top == null; }

public void Push(object o) { top = new Node (o, top); }

public object Pop()

{

    if (top == null)

      throw new Exception ("Can't Pop from an empty Stack");

    else

    {

      object pop = top.Value;

      top = top.Next;

      return pop;

    }

}

}

Теперь методом копирования добавьте в класс Program метод TestStack, и проверьте работу коллекции.

  static void TestStack()

  {

    Console.Clear();

    Console.WriteLine("Test Stack\n");

    Stack stack = new Stack();

    stack.Push(new Man("Alex Black", 30));

    stack.Push(new Man("Jane Fonda", 28));

    stack.Push(new Man("Peter Norton", 36));

    stack.Push("One");

    stack.Push("Two");

    stack.Push(new Exception("This is an exception object"));

    stack.Push(DateTime.Now);

    stack.Push(Math.PI);

    stack.Push(Math.E);

    Console.WriteLine("\nMy Stack had\n");

    while (!stack.IsEmpty())

      Console.WriteLine(stack.Pop());

    Console.WriteLine("\n\t\tPress any key to go to main menu\n");

    Console.ReadKey(true);

  }

Исключительные ситуации

При тестировании созданных нами модулей, обнаруживаются слабые места. Запустите проект в режиме отладки (F5) и убедитесь, что при вводе возраста человека, система выбрасывает исключение, если вместо ожидаемых цифр, ввести другие символы. Исключение имеет вид диалога, в котором приведено (на мой взгляд, исчерпывающее) объяснение причины.

Input string was not in a correct format.

При запуске в нормальном режиме (Ctrl+F5) и нажатии кнопки Close, текстовое сообщение, объясняющее причину ошибки, будет выведено в консольное окно.

Зададимся целью самостоятельно обработать исключение, вызываемое погрешностями ввода числовой информации. Для этого создадим две вспомогательные функции, одна из которых (MakeInt) будет следить за вводом, а другая (AskInt) позволит зациклить запрос с целью добиться корректного ввода. Эти функции носят общий характер, поэтому их надо сделать доступными для всех классов нашего пространства имен MyConsole.

В C# отсутствует понятие глобальных сущностей. Здесь все функции и данные должны быть инкапсулированы в классы. Если функция или элемент данных имеют общий характер, то есть для их использования не требуется предварительно создавать и инициализировать объекты каких-то известных классов, то ваш выбор должен пасть на члены класса типа static. Из курса ООП вы, вероятно, знаете, что static–данные являются общими для всех объектов класса и хранятся в единственном экземпляре. Вы также знаете, что static–функции могут (а теперь и должны) вызываться по имени класса. Значит, для их вызова не нужно предварительно создавать объект класса. Таким образом, static-данные (в новых условиях) — это аналоги глобальных данных.