# 000168. Перегрузка операторов в c\#

Перегрузка операторов в c#||wmysterio|wmysterio|<wmysterio@yandex.ru>|/||Всем привет! С Вами wmysterio, и в этом уроке мы рассмотрим очередную возможность в c#, как перегрузка операторов. При создании собственного класса, иногда приходится как-то сравнивать экземпляры одного и того же класса. Например: больше объект за другого или меньше. Обычное объявления класса не позволяет выполнять такие проверки. Однако язык имеет возможность задать условия таких проверок.\
Стандарный шаблон перегрузки оператора имеет вид:

Кодpublic static bool operator > ( ТИП\_ДАННЫХ имя1, ТИП\_ДАННЫХ имя2 ) {\
&#x20; return ОПЕРАЦИЯ\_ПРОВЕРКИ;\
}Перегрузка обязательно должна быть статической(общей)! Операция проверки выполняется как правило с каким-то значением поля или свойства класса, по которым можно сравнить два экземпляра. Одним из параметров в шаблоне должен быть тип, который соответсвует классу, в который вложен метод. Порядок аргументов имеет значение и я продемонструрую это на практике. К примеру, создалим простой класс Car, с набором стандартных свойств:Кодpublic class Car {\
\
&#x20; public int Size { get; set; }\
&#x20; public string Name { get; set; }\
\
&#x20; public Car() {\
&#x20; Size = 10;\
&#x20; Name = "Car";\
&#x20; }\
}Свойства отвечают за размер машины и её имя. Логично было бы сравнивать по размеру машины, а не по её имени для оператора > или <. Из этого наша перегрузка будет иметь вид:Кодpublic static bool operator > ( Car car1, Car car2 ) {\
&#x20; return car1.Size > car2.Size;\
}В качестве параметров мы передали два объекта, класса Car. C# требует, чтобы с этой перегрузкой так же была объявлена и операция для <:Кодpublic static bool operator < ( Car car1, Car car2 ) {\
&#x20; return !( car1 > car2 );\
}В последнем я делал проверку на БОЛЬШЕ между передаными параметрами, и возвращал инвертированное булевое значение. Полная программа будет иметь код:Кодnamespace TestProgramm {\
\
&#x20; class Program {\
\
&#x20; static void Main( string\[] args ) {\
\
&#x20; Car c1 = new Car();\
&#x20; Car c2 = new Car();\
&#x20; c1.Size = 100;\
&#x20; c2.Size = 70;\
\
&#x20; if( c1 > c2 )\
&#x20; Console.WriteLine( "Машина 1 больше за машину 2" );\
&#x20; else\
&#x20; Console.WriteLine( "Машина 1 не больше за машину 2" );\
\
&#x20; Console.ReadKey();\
&#x20; }\
\
&#x20; }\
\
&#x20; public class Car {\
\
&#x20; public int Size { get; set; }\
&#x20; public string Name { get; set; }\
\
&#x20; public Car() {\
&#x20; Size = 10;\
&#x20; Name = "Car";\
&#x20; }\
\
&#x20; public static bool operator > ( Car car1, Car car2 ) {\
&#x20; return car1.Size > car2.Size;\
&#x20; }\
&#x20; public static bool operator < ( Car car1, Car car2 ) {\
&#x20; return !( car1 > car2 );\
&#x20; }\
\
&#x20; }\
\
}Если нам нужно вравнить экземпляр класса с другим классом или структурой, то в параметрах мы должны подставить другой тип и сравнивать их по какой-то характеристике. Для примера, мы хотим, чтобы наш объект Car можно было сравнить размер с целым числом. Для этого используем следующие перегрузки:Кодpublic static bool operator > ( Car car1, int Value ) {\
&#x20; return car1.Size > Value;\
}\
public static bool operator < ( Car car1, int Value ) {\
&#x20; return car1.Size < Value;\
}Теперь мы сможем сравнивать Car с типом int:Кодstatic void Main( string\[] args ) {\
\
&#x20; Car c1 = new Car();\
&#x20; Car c2 = new Car();\
&#x20; c1.Size = 100;\
&#x20; c2.Size = 70;\
\
&#x20; if( c1 > 80 )\
&#x20; Console.WriteLine( "Машина 1 больше размер 80" );\
&#x20; else\
&#x20; Console.WriteLine( "Машина 1 не больше размер 80" );\
\
&#x20; if( c2 > 80 )\
&#x20; Console.WriteLine( "Машина 2 больше размер 80" );\
&#x20; else\
&#x20; Console.WriteLine( "Машина 2 не больше размер 80" );\
\
&#x20; Console.ReadKey();\
}Однако, если мы напишем условиеКодif( 80 > c1 ) { /\* действия \*/ }то компилятор напомнит нам, что операция не может примятся к операднам int и Car. Это связано как раз таки с тем, что порядок имеет значение при перегрузке операторов. А именно первый агрумент функции будет относить всю функцию к группе методов того типа. Для того, чтобы мы могли выполнить написанные операции, нужно перегрузить их следующим образом:Кодpublic static bool operator > ( int Value, Car car1 ) {\
&#x20; return Value > car1.Size;\
}\
public static bool operator < ( int Value, Car car1 ) {\
&#x20; return Value < car1.Size;\
}ПроверкаКодstatic void Main( string\[] args ) {\
\
&#x20; Car c1 = new Car();\
&#x20; Car c2 = new Car();\
&#x20; c1.Size = 100;\
&#x20; c2.Size = 70;\
\
&#x20; if( 80 > c1 )\
&#x20; Console.WriteLine( "Размер 80 больше за машину 1" );\
&#x20; else\
&#x20; Console.WriteLine( "Размер 80 не больше за машину 1" );\
\
&#x20; if( 80 > c2 )\
&#x20; Console.WriteLine( "Размер 80 больше за машину 2" );\
&#x20; else\
&#x20; Console.WriteLine( "Размер 80 не больше за машину 2" );\
\
&#x20; Console.ReadKey();\
}показала, что всё адекватно отработало.\
\
Аналогично можно сделать для операторов **>=**, **<=**, **==** и **!=** а так-же для других типов данных.\
\
Кроме этих операторов мы можем написать перегрузку и для привычных нам **+**, **-**, \*\*\*\*\* и **/**. Операцию присваивания(**=**) нельзя перегружать, как это я наблюдал с C++.\
Это значит, что мы сможем к нашему классу Car выполнить арифметические аперации. Для примера, арифметические операции будут выполняться со свойством Size. Шаблон перегрузки немного другой:Кодpublic static ТИП\_1 operator + ( ПАРАМЕТР\_1, ПАРАМЕТР\_2 ) {\
&#x20; return ОБЪЕКТ\_ТИП\_1;\
}Суть думаю понятна. Мы обязаны сделать возврат объекта того типа, что указали при перегрузке(ТИП\_1). Параметры действуют точно так же, как при перегрузке в предыдущих примерах.\
Давайте для примера, сделаем перегрузку всех арифметических операций в классе Car:Кодpublic static Car operator + ( Car car1, int Value ) { car1.Size += Value; return car1; }\
public static Car operator - ( Car car1, int Value ) { car1.Size -= Value; return car1; }\
public static Car operator \* ( Car car1, int Value ) { car1.Size \*= Value; return car1; }\
public static Car operator / ( Car car1, int Value ) { car1.Size /= Value; return car1; }\
public static Car operator + ( int Value, Car car1 ) { car1.Size += Value; return car1; }\
public static Car operator - ( int Value, Car car1 ) { car1.Size -= Value; return car1; }\
public static Car operator \* ( int Value, Car car1 ) { car1.Size \*= Value; return car1; }\
public static Car operator / ( int Value, Car car1 ) { car1.Size /= Value; return car1; }Проверим:Кодstatic void Main( string\[] args ) {\
\
&#x20; Car c1 = new Car();\
&#x20; Console.WriteLine( "Изначальное значение размера машины: {0}", c1.Size );\
&#x20; c1 += 190;\
&#x20; Console.WriteLine( "Изменённое значение размера машины: {0}", c1.Size );\
&#x20; c1 \*= 10;\
&#x20; Console.WriteLine( "Изменённое значение размера машины: {0}", c1.Size );\
&#x20; c1 /= 100;\
&#x20; Console.WriteLine( "Изменённое значение размера машины: {0}", c1.Size );\
&#x20; c1 -= 15;\
&#x20; Console.WriteLine( "Конечное значение размера машины: {0}", c1.Size );\
\
&#x20; Console.ReadKey();\
}Всё отлично работает! Но не хватает какой-то изюминки! Точно, мы забыли перегрузить операторы, где можно сделать арифметические операции не только над числами, но и над объектами класса Car! Перегрузим их:Кодpublic static Car operator + ( Car car1, Car car2 ) { car1.Size += car2.Size; return car1; }\
public static Car operator - ( Car car1, Car car2 ) { car1.Size -= car2.Size; return car1; }\
public static Car operator \* ( Car car1, Car car2 ) { car1.Size \*= car2.Size; return car1; }\
public static Car operator / ( Car car1, Car car2 ) { car1.Size /= car2.Size; return car1; }Проверим:Кодstatic void Main( string\[] args ) {\
\
&#x20; Car c1 = new Car();\
&#x20; Car c2 = new Car();\
&#x20; Console.WriteLine( "Размер машины 1 до суммы: {0}", c1.Size );\
&#x20; c1 += c2;\
&#x20; Console.WriteLine( "Размер машины 1 после суммы: {0}", c1.Size );\
\
&#x20; Console.ReadKey();\
}Всё нормально считает!!!\
\
Важно! Здесь очень важно продумать все перегрузки.\
\
Наш финальный вариант класса Car:Кодpublic class Car {\
\
&#x20; public int Size { get; set; }\
&#x20; public string Name { get; set; }\
\
&#x20; public Car() {\
&#x20; Size = 10;\
&#x20; Name = "Car";\
&#x20; }\
\
&#x20; public static bool operator > ( Car car1, Car car2 ) { return car1.Size > car2.Size; }\
&#x20; public static bool operator < ( Car car1, Car car2 ) { return !( car1 > car2 ); }  \
&#x20; public static bool operator > ( Car car1, int Value ) { return car1.Size > Value; }\
&#x20; public static bool operator < ( Car car1, int Value ) { return car1.Size < Value; }\
&#x20; public static bool operator > ( int Value, Car car1 ) { return Value > car1.Size; }\
&#x20; public static bool operator < ( int Value, Car car1 ) { return Value < car1.Size; }\
\
&#x20; public static Car operator + ( Car car1, int Value ) { car1.Size += Value; return car1; }\
&#x20; public static Car operator - ( Car car1, int Value ) { car1.Size -= Value; return car1; }\
&#x20; public static Car operator \* ( Car car1, int Value ) { car1.Size \*= Value; return car1; }\
&#x20; public static Car operator / ( Car car1, int Value ) { car1.Size /= Value; return car1; }\
&#x20; public static Car operator + ( int Value, Car car1 ) { car1.Size += Value; return car1; }\
&#x20; public static Car operator - ( int Value, Car car1 ) { car1.Size -= Value; return car1; }\
&#x20; public static Car operator \* ( int Value, Car car1 ) { car1.Size \*= Value; return car1; }\
&#x20; public static Car operator / ( int Value, Car car1 ) { car1.Size /= Value; return car1; }\
&#x20; public static Car operator + ( Car car1, Car car2 ) { car1.Size += car2.Size; return car1; }\
&#x20; public static Car operator - ( Car car1, Car car2 ) { car1.Size -= car2.Size; return car1; }\
&#x20; public static Car operator \* ( Car car1, Car car2 ) { car1.Size \*= car2.Size; return car1; }\
&#x20; public static Car operator / ( Car car1, Car car2 ) { car1.Size /= car2.Size; return car1; }\
\
}Надеюсь эта информация была полезна для Вас. С Вами wmysterio, увидимся.|1532|1|0||peregruzka\_operatorov\_v\_c|1423317585


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00300/00100/000168.-peregruzka-operatorov-v-c.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
