Имя Пароль
Зарегистрироваться


* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Перегрузка операторов в Visual C#
8 февраля 2009

При работе с пользовательскими типами данных порой удобно определять арифме-
тические или логические операторы, а также операторы сравнения, способные ра-
ботать с этими типами. Рассмотрим следующую структуру:
Visual C#
public struct HoursWorked
float Regular-Hours;
float OvertimeHours;
Подобную простую структуру можно использовать в бухгалтерском приложении
для учета часов рабочего времени и сверхурочных, но при работе с несколькими
экземплярами такой структуры возможны сложности. Представьте, например, что
требуется сложить значения двух экземпляров такой структуры. Чтобы решить эту
задачу, придется писать новый метод, способный складывать экземпляры этой
структуры. Для сложения трех и больше экземпляров потребуется вызвать этот ме-
тод несколько раз. К счастью, С# позволяет определять поведение оператора при
обработке пользовательских типов данных. Например, чтобы получить возможность
суммировать структуру из нашего примера, можно создать перегруженную версию
оператора «+», добавив к ней необходимую функциональность.
Перегруженные операторы создают с помощью ключевого слова operator, имею-
щего следующий синтаксис:
Visual C#
public static type operator op (Argument1[, Argument2~\')
II Здесь должна быть реализация.
где type — это тип, с которым работает оператор, он одновременно является типом
значения, возвращаемого оператором; Argument 1 и Argumem2~ это аргументы опе-
ратора. Любой унарный оператор обрабатывает только один аргумент с типом type.
Бинарные операторы требуют два аргумента, минимум один из которых должен
быть с типом type. Op — это, собственно, оператор, например «+», «—», «>», «!=» и
т.д. Перегруженные операторы необходимо объявлять с модификаторами public
(чтобы клиенты, работающие с вашим типом данных, смогли получить к нему дос-
туп) и static. Перегруженный оператор следует объявлять внутри определения поль-
зовательского типа данных, для работы с которым он предназначен. Мы рассмот-
рели пример со структурой, но также можно определить перегруженный оператор,
способный работать с классами, — все перегруженные операторы определяются
одинаково. Вот пример перегруженного оператора «+», предназначенного для ра-
боты с созданной выше структурой HoursWorked:
Visual C#
public struct HoursWorked
float RegularHours;
float OvertimeHours;
// Перегруженный оператор должен быть объявлен в определении класса,
// для работы с которым он предназначен.
public static HoursWorked operator + (HoursWorked a, HoursWorked b)
HoursWorked Result = new HoursWorkedO;
Result.RegularHours - a.RegularHours + b.RegularHours;
Result.OvertimeHours = a.OvertimeHours + b.OvertimeHours;
return Result;
Перегруженный оператор используют в программе, как любой другой оператор.
Ниже показан пример кода, выполняющего сложение двух экземпляров структуры
Hours Worked:
Visual C#
// Этот пример предполагает, что переменные Sunday и Monday содержат
// экземпляры структуры HoursWorked, инициализированные соответствующими
// значениями.
HoursWorked total - new HoursWorkedO;
total - Sunday + Monday;
Как и в случае с перегруженными методами, допустимо создавать различные
реализации перегруженных операторов при условии, что они отличаются сигнату-
рами, Вернемся к примеру со структурой HoursWorked, Допустим, нам потребова-
лась возможность прибавлять значения типа Integer к полю NormalHours с помощью
оператора «+». Эту задачу удастся решить, создав еще одну версию перегруженного
оператора «+»:
Visual C#
float RegularHours;
float OvertimeHours;
// Это версия перегруженного оператора, определенная в предыдущем примере.
oublic static Hot-rsWorked operator + (HoursWorked a, HoursWorked b)
{
HoursWorked Result = new HoursWorkedO;
Result.RegularHours - a.RegularHours + b.RegularHours;
Result.OvertimeHours = a.OvertimeHours + b.OvertimeHours;
return Result;
// Новая версия перегруженного оператора + с новой реализацией.
public static HoursWorked operator + (HoursVJorked a, int b)
{
HoursWorked Result = new HoursWorkedO;
Result. RegularHours = a.RegularHours + b:
return Result;
Чтобы создать перегруженный оператор с помощью Visual C#, выполните сле-
дующие действия.
1. Объявите перегруженный оператор внутри определения класса или структуры,
для работы с которыми он предназначен, при помоши ключевого слова operator.
Перегруженные операторы необходимо объявлять с модификаторами public и
static. Если объявляется бинарный оператор, по крайней мере один из его аргу-
ментов должен иметь тот же тип, что и возвращаемое значение,
2. Напишите реализацию для оператора.

Теги: .NET

Статьи по теме:

Извлечение типизированных данных с помощью объекта DataReader
Декларативная защита по правам доступа к коду
Создание абстрактных членов
Применение встроенной функциональности типов данных
Пошаговое исполнение кода
Ограничения Foreign Key
Стыковка и фиксация элементов управления
Работа с классом Help
Графический дизайнер
Локализация формы
Связывание, просмотр и фильтрация данных
Развертывание проекта
Разрешения
Редактор файловой системы
Использование провайдеров дополнительных свойств
| .NET | Pavel |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | .NET | Перегрузка операторов в Visual C#. Регион сайта: Москва и Санкт-Петербург