Чтение онлайн

на главную

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

Инструкция using

Конечная часть приведенного выше кода, который начинает проект

SquareRoot
, состоит из инструкций
using
:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace Wrox.ProfessionalCSharp.AppendixC.SquareRootSample {

Эти инструкции

using
присутствуют здесь, чтобы упростить код. Полные имена классов, включающие имена пространств имен, будут длинными. Например, позже в этом коде определяется пара текстовых
полей. Текстовое поле представляется классом
System.Windows.Forms.TextBox
. Если писать это в коде каждый раз при ссылке на
Text Box
, код будет выглядеть очень загроможденным. Вместо этого инструкция
using System.Windows.Forms
; дает задание компилятору найти в этом пространстве имен все классы, которые отсутствуют в текущем пространстве имен и для которых не определено пространство имен. Теперь можно просто писать
TextBox
везде, где необходимо сослаться на этот класс. Обычно любая программа на C# начинается с ряда инструкций
using
, вводящих все пространства имен, которые будут использоваться в множество пространств имен, просматриваемых компилятором. Пространства имен, определенные в приведенном выше коде охватывают различные части библиотеки базовых классов .NET, и поэтому позволяют, что очень удобно, использовать различные базовые классы .NET.

Определение класса: наследование

Теперь мы переходим к определению класса

SquareRootForm
. Само определение достаточно простое:

public class SquareRootForm : System.Windows.Forms.Form {

Ключевое слово class сообщает компилятору, что будет определен класс. Интерес в данном случае представляет двоеточие после имени класса, за которым следует другое имя

Form
. Это момент, где мы вводим упоминавшуюся ранее важную концепцию, которую необходимо знать, чтобы понимать программирование на C#,— наследование

Приведенный выше синтаксис сообщает компилятору, что класс

SquareRootForm
наследуется из класса
Form
(в действительности из
Windows.Forms.Form
). Это означает, что класс получает не только все методы, свойства и т.д., которые мы определяем, он получает все, что было в классе
Form
.
Form
является очень мощным базовым классом .NET, который предоставляет все свойства базовой формы. Он содержит методы, позволяющие форме выводиться, и большое количество свойств, включая
Height
,
Width
,
Desktop Location
,
BackColor
(фоновый цвет формы), которые управляют внешним видом формы на экране. Наследуя от этого класса, наш собственный класс сразу получает все эти свойства и является поэтому полноценной формой. Класс, от которого наследуют, называется базовым классом, а новый класс называют производным классом.

Если вы знакомы с интерфейсами, то наследование не должно быть для вас новым понятием, так как интерфейсы могут наследоваться друг из друга. Однако здесь имеется значительно более мощная конструкция, чем наследование интерфейсов. Когда интерфейс COM наследуется из другого интерфейса, он получает только имена и сигнатуры методов и свойства. Это, в конце концов, все, что содержит интерфейс. Однако класс содержит весь код, который реализует эти методы, и тому подобное также, как в VB делает объект класса. Это означает, что

SquareRootForm
получает все реализации из класса
Form
, а также имена методов. Этот вид наследования называется наследованием реализации, он не является новинкой в C#: это была фундаментальная концепция классического объектно-ориентированного программирования (OOP), которой пользовались в течение десятилетий. Программы C++, в частности, обычно работают на основе этой концепции, но она не поддерживается VB. (Наследование реализации имеет сходство с созданием подклассов.) При разработке программ на C# можно обнаружить, что вся архитектура типичной программы C# почти всегда основывается на наследовании реализации.

Но наследование реализации является еще более мощным средством. Как будет показано позже, когда класс наследуется из другого класса, он не обязан брать все реализации в базовом классе. При желании можно изменить

реализации определенных методов и свойств с помощью технологии, называемой переопределением. Это означает, что можно создать класс, который очень похож на существующий, но имеет некоторые отличия в том. как и что он делает. Это существенно облегчает повторное использование кода, написанного другими людьми, сберегая тем самым время разработки. Также важно понять, что не требуется доступ к исходному коду базового класса, чтобы наследовать из него. По очевидным коммерческим соображениям компания Microsoft сохраняет исходный код класса Form для себя. Тот факт, что компилированная библиотека доступна в форме сборки, является достаточным, чтобы можно было наследовать от этого класса, используя требуемые методы и переопределяя методы, которые не нужны.

Точка входа в программу

Основной точкой входа в программу является функция

Main
:

class MainEntryClass {

 /// <summary>

 /// Основная точка входа приложения.

 /// </summary>

 [STAThread]

 static void Main {

SquareRootForm TheMainForm = new SquareRootForm;

Application.Run(TheMainForm);

 }

}

Это не очевидная точка входа в программу, но это — она. Правило в C# говорит, что выполнение программы начинается с метода с именем

Main
. Этот метод должен быть определен как статический в том же классе. Обычно должен быть только один метод во всех классах в исходном коде, который отвечает этому описанию в программе, иначе компилятор не будет знать, какой из них выбрать.
Main
здесь определен без параметров и как возвращающий
void
(другими словами, не возвращающий ничего). Это не единственная возможная сигнатура этого метода, но это обычная сигнатура для приложения Windows (приложения командной строки получают параметры — это любые аргументы, задаваемые в командной строке).

Как упоминалось раже, код VB может иметь метод

Main
, но он редко используется и не является обязательным. В C# метод
Main
должен присутствовать как основная точка входа в программу.

Так как метод

Main
должен быть в классе, то здесь присутствует класс с именем
MainEntryClass
. В этом классе нет ничего другого, но это не обязательно должно быть так, вполне допустимо для класса, в котором определена точка входа в программу, содержать и другие методы. Тот факт, что метол
Main
— статический метод, является важным. Мы говорили раньше, что статические методы являются специальными методами, которые могут выполняться без реального создания в начале программы объекта класса. Так как при выполнении прежде всего вызывается метод
Main
, то в этот момент не существует никаких экземпляров никаких классов — еще не выполнился никакой код для их создания. Вот почему точка входа должна быть статической.

Помимо ключевого слова

static
, определение
Main
выглядит, как и предыдущие рассмотренные определения методов. Однако перед ним стоит в квадратных скобках слово
[STAThread]
,
[STAThread]
является примером атрибута — еще одной концепции, которая не имеет аналогов в исходном коде VB.

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

[STAThread]
в исходном коде C# имеет эффект, аналогичный выбору модели потоков выполнения в Project Properties в VB IDE, хотя в VB это можно делать только для проектов ActiveX DLL и ActiveX Control. Отметим также, что эта аналогия только приблизительная, так как атрибут C# выбирает модель потоков выполнения .NET, а не модель потоков COM.

Поделиться:
Популярные книги

Путь Чести

Щукин Иван
3. Жизни Архимага
Фантастика:
фэнтези
боевая фантастика
6.43
рейтинг книги
Путь Чести

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Кротовский, не начинайте

Парсиев Дмитрий
2. РОС: Изнанка Империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, не начинайте

Под маской моего мужа

Рам Янка
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Под маской моего мужа

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Темный Патриарх Светлого Рода 5

Лисицин Евгений
5. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 5

Возвышение Меркурия. Книга 8

Кронос Александр
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8

Менталист. Революция

Еслер Андрей
3. Выиграть у времени
Фантастика:
боевая фантастика
5.48
рейтинг книги
Менталист. Революция

Маршал Советского Союза. Трилогия

Ланцов Михаил Алексеевич
Маршал Советского Союза
Фантастика:
альтернативная история
8.37
рейтинг книги
Маршал Советского Союза. Трилогия

Штурм Земли

Семенов Павел
8. Пробуждение Системы
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Штурм Земли

Баоларг

Кораблев Родион
12. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Баоларг

Измена. Верну тебя, жена

Дали Мила
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верну тебя, жена

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6