Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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