Какие операции можно перегружать. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Какие операции можно перегружать.



Перегружать можно не все доступные операции. Те из них, которые перегружать мож­но, перечислены в табл. 7.6.

Таблица 7.6. Операции, которые разрешено перегружать

Категория Операции Ограничения
Арифметические бинарные +,-,*,/,% Нет
Арифметические унарные +,-,++,-- Нет
Битовые бинарные &,|,^,<<,>> Нет
Битовые унарные !,~ true, false Операции true и false должны перегружаться в паре
Сравнение ==,!= <=,>= <,> Операции сравнения должны перегружаться попарно
Присваивание +=,-=,*=,/=,>>=, <<=,%=,&=,|=,^= Эти операции нельзя явно перегрузить; их перегрузка осуществляется неявно при переопределении индивидуальных операций +, -, % и т. д.
Индексация [] Операцию индекса нельзя перегрузить явно. Тип индексирующего члена, описанный в разделе 6.2, позволяет поддерживать операцию индексации в пользовательских классах и структурах
Приведение () Операцию приведения нельзя перегрузить явно. Пользовательские приведения (описанные ниже) позволяют реализовать настраиваемые приведения

 

Пользовательские приведения

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

При явном приведении вы явно обозначаете приведение в коде, указывая в скобках тип, к которому нужно привести:

int i = 3;

long l = I; // неявное

short s = (short)i; // явное

Для предопределенных типов данных явные приведения требуются тогда, когда возни­кает риск потери данных вследствие приведения. Ниже перечислено несколько примеров.

- При преобразовании int в short, потому что размер short недостаточен для со­хранения значения int.

- При преобразовании типов данных со знаком в беззнаковые может быть получен не­верный результат, если переменная со знаком содержит отрицательное значение.

- При преобразовании типов с плавающей точкой в целые дробная часть теряется.

- При преобразовании из типа, допускающего null-значения, в тип, не допускающий null, если исходная переменная содержит null, то генерируется исключение.

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

Поскольку C# позволяет определять собственные типы данных (структуры и классы), это значит, что вам понадобятся средства поддержки приведения к этим типам и из них. Механизм заключается в том, что вы можете определить приведение как операцию-член одного из классов. Операция приведения должна быть помечена либо как implicit, либо как explicit, чтобы указать, каким образом ее предполагается использовать. Ожидается, что вы будете следовать тем же рекомендациям, что и в случае предопределенных при­ведений: если уверены, что данное приведение всегда безопасно независимо от значения исходной переменной, то определяете его как implicit (неявное). Однако когда извести но, что существует опасность, когда при определенных значениях что-то может пойти не так - возможно, потеряются данные или сгенерируется исключение - в таком случае при­ведение должно быть определено как explicit (явное).

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

Синтаксис определения приведения подобен синтаксису перегруженных операций, который вы уже видели в настоящей главе. И это не случайно, потому что приведение рассматривается как операция, эффект применения которой состоит в преобразовании исходного типа в целевой. Чтобы проиллюстрировать синтаксис, рассмотрим фрагмент из примера структуры Currency, которая будет представлена ниже:

public static implicit operator float (Currency value)

{

// код обработки

}

Возвращаемый тип операции определяет целевой тип операции приведения, а единст­венный параметр - исходный объект, подвергающийся преобразованию. Показанное здесь приведение позволяет неявно преобразовывать значение Currency в float. Обратите внимание, что если бы приведение было объявлено как explicit, то компилятор разре­шал бы только явное его использование. Как и другие перегруженные операции, приведе­ния должны быть объявлены как public и static.

Разработчики на C++ отметят, что в этом язык C# отличается от C++, где приведения являются членами экземпляров классов.

 



Поделиться:


Последнее изменение этой страницы: 2016-12-30; просмотров: 151; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.20.57 (0.004 с.)