Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 3:

Обзор среды .NET Framework

Вынесение точки входа в самостоятельный класс

В последнем примере мы внутри класса MyClass в методе Main() создавали объекты того же самого класса. Это вносит лишнюю путаницу в изучение кода. Функция Main() никакого отношения к классу MyClass не имеет и присутствует там только из-за того, что глобальные функции в C# недопустимы и ее нужно куда-то приткнуть. Вынесем ее в отдельный класс, чтобы отделить "котлеты от мух".

Вначале заменим сервисные методы доступа к закрытым полям класса на общедоступные свойства.

  • Измените код файла MyClass.cs так, как показано ниже
using System;
using System.Windows.Forms;
    
namespace MyApp
{
    class MyClass
    {
        // Внутренние (по умолчанию) переменные - поля
        int x, y;
    
        // Конструктор с параметрами
        public MyClass(int x, int y) 
        {
            this.x = x;
            this.y = y;
        }
    
        // Общедоступные свойства класса
        public int X
        {
            get { return x; }
            set { x = value; }
        }
    
        public int Y
        {
            get { return y; }
            set { y = value; }
        }
    
        // Точка входа в программу без аргументов
        static void Main()
        {
            // Настройка консоли
            Console.Title = "";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
    
            // Создаем экземпляр класса
            MyClass ob = new MyClass(10, 15);
            Console.WriteLine("x = {0}; y = {1}", ob.X, ob.Y);
    
            Console.ReadLine();
        }
    }
}
Листинг 3.7 . Упаковка полей класса в общедоступные свойства

Операторы get и set называются аксессорами, а ключевое слово value способно иметь значение любого типа. Свойство можно объявить "только для чтения", используя ключевое слово readonly, а можно просто убрать блок аксессора set.

  • Запустите приложение, чтобы получить результат

Теперь обращение к внутренним полям класса осуществляется через общедоступные свойства.

Упакуем функцию Main() в отдельный класс с именем EntryPoint, для этого

  • Выделите код функции Main() и выполните для выделенного фрагмента опцию контекстного меню Surround With (охватить с помощью)

  • В появившемся всплывающем меню выберите тип охватывающего блока class

Оболочка создаст встроенный класс с дежурным именем MyClass. Встроенный класс по умолчанию будет иметь область видимости внутри охватывающего класса, если к нему не добавить модификатор доступа public, т.е. по нему можно создавать объекты только внутри внешнего класса. Кроме того, синтаксис C# не допускает в одном пространстве имен существование типов с одинаковыми именами.

  • Переименуйте новый класс в EntryPoint и запустите приложение

Мы видим, что функция Main() доступна и из внутреннего класса.

  • Вынесите класс EntryPoint в пространство имен проекта и запустите приложение. Все остается прежним!
  • Для структурирования отступов в коде уничтожте последнюю закрывающую фигурную скобку пространства имен и вновь ее создайте. Код будет выровнен!

Размещение классов в отдельных файлах

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

Разработчики оболочки предполагали, что в файле Program.cs будет находиться функция Main(), а пользовательский код желательно (но не обязательно) размещать в других файлах. Согласимся с ними.

  • Выберите опцию главного меню Project/Add New Item и заполните диалоговое окно мастера так

  • Перенесите в новый файл содержимое класса MyClass

После этого коды файлов будут такими

using System;
    
namespace MyApp
{
    class EntryPoint
    {
        // Точка входа в программу без аргументов
        static void Main()
        {
            // Настройка консоли
            Console.Title = "";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
    
            // Создаем экземпляр класса
            MyClass ob = new MyClass(10, 15);
            Console.WriteLine("x = {0}; y = {1}", ob.X, ob.Y);
    
            Console.ReadLine();
        }
    }
}
Листинг 3.8 . Файл Program.cs
using System;
    
namespace MyApp
{
    class MyClass
    {
        // Внутренние (по умолчанию) переменные - поля
        int x, y;
    
        // Конструктор с параметрами
        public MyClass(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    
        // Общедоступные свойства класса
        public int X
        {
            get { return x; }
            set { x = value; }
        }
    
        public int Y
        {
            get { return y; }
            set { y = value; }
        }
    }
}
Листинг 3.9 . Файл MyClass
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974