KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Симон Робинсон - C# для профессионалов. Том II

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Симон Робинсон, "C# для профессионалов. Том II" бесплатно, без регистрации.
Перейти на страницу:

 //

 // txtNumber

 //

 this.txtNumber.Location = new System.Drawing.Point(160, 24);

 this.txtNumber.Name = "txtNumber";

 this.txtNumber.TabIndex = 0; this.txtNumber.Text = "";

 //

 // txtSign

 //

 this.txtSign.Enabled = false;

 this.txtSign.Location = new System.Drawing.Point(160, 136);

 this.txtSign.Name = "txtSign";

 this.txtSign.TabIndex = 1;

 this.txtSign.Text = "";

Этот код задаёт начальные позиции и начальный текст двух элементов управления, текстового поля ввода и текстового поля, которое выводит знак заданного числа. Новый элемент кода состоит в том что положение относительно верхнего левого угла экрана задается с помощью Point. Point является базовым классом .NET (строго говоря, структурой), который содержит x- и y-координаты. Синтаксис двух строк, задающих Location, является инструктивным. Свойство TextBox.Location является просто ссылкой на Point, поэтому, чтобы задать ему значение, необходимо создать и инициализировать объект Point, содержащий правильные координаты. Это первое использование нами конструктора с параметрами — в данном случае горизонтальной и вертикальной координат Point и, следовательно, элемента управления. Если было бы желательно транслировать одну из этих строк в VB, предполагая, что был определён некоторый модуль класса VB с именем Point, и мы имели бы класс, который имеет такое свойство, то лучшее, что можно было бы сделать, выглядело бы примерно следующим образом:

Dim Location As Point

Set Location = New Point

Location.X = 160

Location.Y = 24

SomeObject.Location = Location

Это сравнимо со следующим кодом на C#:

someObject.Location = new System.Drawing.Point(160, 24);

Относительная компактность эквивалентной инструкции C# должна быть очевидна.

Теперь рассмотрим те же команды для кнопки. В этом случае можно наблюдать задание свойств такого же вида, но здесь имеется другая вещь, которую необходимо выполнить: приказать Windows вызвать наш обработчик событий, когда нажимается кнопка. Это делает последняя строка из нижеследующих.

 this.cmdShowResults.Name = "cmdShowResults";

 this.cmdShowResults.Size = new System.Drawing.Size(88, 23);

 this.cmdShowResults.TabIndex = 3;

 this.cmdShowResults.Text = "Show Results";

 this.cmdShowResults.Click +=

  new System.EventHandler(this.OnClickShowResults);

Здесь происходит следующее. Кнопка, обозначенная как объект кнопки cmdShowResults, содержит событие Click, которое будет инициироваться, когда пользователь на нее нажмет. Надо добавить для этого события собственный обработчик событий. Сейчас C# не разрешает передавать имена методов непосредственно, вместо этого они должны помещаться в так называемый объект делегат. Детали этого здесь не рассматриваются, они приведены в главе 6 данной книги, но это делается для обеспечения безопасности типов. Вследствие такого действия появляется текст new System.EventHandler() в этом коде. Когда имя обработчика событий будет спрятано, мы добавим его к событию, используя оператор +=, который будет рассмотрен ниже.

Арифметические операторы присваивания

Символ += представляет в C# так называемый оператор сложения-присваивания. Он дает удобное сокращение для случаев, когда необходимо добавить некоторую величину к другой величине. Это работает следующим образом. Пусть в VB объявлены два целых числа А и В и необходимо записать следующее выражение:

В = В + А

В C# можно записать похожим образом:

В = В + А;

Однако в C# для этого существует альтернативная сокращенная запись:

B += А;

+= в действительности означает "сложить значение выражения справа с переменной слева" и это работает для всех числовых типов данных, а не только для целых. Существуют также другие аналогичные операторы *=, /= и -=, которые соответственно умножают, делят и вычитают величину слева из переменной справа. Поэтому, например, чтобы разделить число на 2 и присвоить результат снова В, можно написать:

B /= 2;

Хотя в этом приложении не рассматриваются подробности, но C# имеет другие операторы, представляющие побитовые операции, а также дающие остаток при делении, и почти все они имеют соответствующие операторы операция-присваивание (см. главу 3).

В примере SquareRootForm оператор сложения-присваивания применен к событию, строка:

this.cmdShowResults.Click +=

 new SyBtem.EventHandler(this.OnClickShowResults)

означает: "добавить этот обработчик к событию". Может быть немного удивительным увидеть оператор, подобный +=, который применяется к чему-то, что не является таким простым числовым типом данных, как int или float, но это на самом деле иллюстрирует важный момент в отношении операторов в C# по сравнению с операторами в VB:

Операторы, подобные +, * и т.д. в VB действительно имеют значение, только когда применяются к числовым данным. Но в C# они могут применяться к объектам любого типа.

Приведенное выше утверждение необходимо немного уточнить. Чтобы применять эти операторы к другим типам объектов, необходимо сначала сообщить компилятору, что эти операторы означают для других типов объектов — процесс, называемый перезагрузкой операторов. Он работает примерно следующим образом. Предположим, что необходимо написать класс, который представляет, скажем, математический вектор. В VB это можно закодировать как модуль класса, который позволит написать:

Dim V1 As Vector

Set V1 = New Vector

В математике векторы можно складывать, что будет обеспечено с помощью перезагрузки операторов. Но VB6 не поддерживает перезагрузку, поэтому вместо этого в VB6 вероятно придется определить метод Add для Vector, и, таким образом, сделать следующее:

' V1, V2 и V3 являются векторами

Set V3 = V1. Add(V2)

В VB это лучшее, что можно придумать. Однако в C#, если определить класс Vector, можно добавить в него перезагруженный оператор для +, который является по сути методом, имеющим имя operator+, и который компилятор будет вызывать, если увидит +, примененный к Vector. Это означает, что в C# можно будет написать:

// V1, V2 и V3 являются векторами

V3 = V1 + V2;

Очевидно, что перезагруженные операторы не будут определяться для всех классов. Для большинства классов не будут иметь смысла действия типа сложения или умножения объектов. Однако для классов, для которых это имеет смысл, перезагрузка операторов может сделать код значительно проще для восприятия. Именно это и происходит с событиями. Поскольку имеет смысл говорить о добавлении обработчика к событию, был предоставлен перезагруженный оператор, чтобы позволить делать это, используя интуитивно понятный синтаксис с помощью операторов + (и +=). Можно также использовать - или -= для удаления обработчика из события.

Подводя итог

Мы получили максимум возможного из рассмотрения примеров SquareRootForm. Существует значительный объем кода C#. который не был рассмотрен в версии C# этого приложения, но этот дополнительный код связан в основном с заданием различных других элементов управления на форме, и не вводи никаких новых принципов, поэтому мы не заострили на нем внимание.

К этому моменту мы получили представление о синтаксисе C#. Мы видели, что он позволяет писать инструкции, которые значительно короче, чем соответствующий код VB. Мы также заметили, что C# помещает весь код в исходный файл в отличие от VB, где большая часть базового кода скрыта от программиста, что делает код проще за счет уменьшения гибкости при создании приложений. Мы также познакомились с концепцией наследования.

Однако мы пока еще не видели реального примера некоторого кода, который можно написать на C#, но крайне трудно создать код, делающий то же самое на VB. Мы собираемся рассмотреть такой пример в следующем разделе, где будут с помощью некоторых классов проиллюстрированы возможности наследования.

Пример: Employees и Managers

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

Модуль класса Employee в VB

Следующий код представляет попытку закодировать модуль класса Employee на VB. Модуль класса предоставляет два открытых свойства: EmployeeName и Salary, а также открытый метод GetMonthlyPayment(), возвращающий сумму, которую компания должна платить сотруднику каждый месяц. Это не совпадает с зарплатой частично потому, что зарплата предполагается выплачиваемой за год, и частично потому, что позже будет представлена возможность прибавления других выплат компании сотруднику (таких, как бонусы за производительность):

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*