Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Обзор среды .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