|
Прошел курс. Получил код 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


