представляет в 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
, возвращающий сумму, которую компания должна платить сотруднику каждый месяц. Это не совпадает с зарплатой частично потому, что зарплата предполагается выплачиваемой за год, и частично потому, что позже будет представлена возможность прибавления других выплат компании сотруднику (таких, как бонусы за производительность):
' локальные переменные для хранения значений свойств
Private mStrEmployeeName As String ' локальная копия
Private mCurSalary As Currency ' локальная копия
Public Property Let Salary(ByVal curData As Currency)