c# перегрузка операторов

221
02 июля 2018, 01:20

На пути изучения языка C# мне встретилась тема "перегрузка операторов". Вопрос такой : зачем вообще нужна эта перегрузка? Не усложняет ли эта примочка чтения кода?

public class coords
{
     public int X{ get; set;}
     static public int operator +(coords coord1,coords coords2)
     {
         return coord1.X+coord2.X;
     }
}
static void main()
{
    coords coord = new coords(){X = 20};
    coords coord1 = new coords(X = 40);
    Console.WriteLine(coord+coord1); //60
}

Лично мне бы читать такой код было затруднительно, вить более проще понять когда так:

Console.WriteLine(coord.X+coord1.X);//60

Просил бы привести пример, когда перегрузка операторов действительно полезна и нужна.

Answer 1

Перегрузка позволяет Вам работать с классами более привычными методами:

например, пишите вы класс для комплексных чисел

у этих чисел также есть сложение, вычитание, умножение и деление, однако они (особенно умножение и деление) выглядят иначе, чем для обычных чисел:

сложение

public static Complex operator +(Complex z1, Complex z2)
{
    return new Complex(z1.re + z2.re, z1.im + z2.im);
}

в основном коде достаточно написать

z = z1 + z2;

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

z1*z2

где ошибиться гораздо сложение, да и читабельнее.

Одной из перегрузок является перегрузка операторов Equals, == и !=, позволяющая Вам заранее определить методику сравнения на равенство двух объектов. По умолчанию C# сравнивает на равенство с помощью функции Equals определенной в классе Object,, а это значит, что два одинаковых объекта будут не равны между собой.

И это только самое простое, что мне сходу пришло в голову.

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

READ ALSO
C# разница между & и &&

C# разница между & и &&

Имеется следующий блок кода

243
Проблема с кодировкой кириллицы

Проблема с кодировкой кириллицы

Производится шифрование текста в изображение (цифровая стеганография, метод LSB)Но при расшифровке текста из изображения (именно кириллицы),...

273
Бинарный поиск строки в массиве байт на C#

Бинарный поиск строки в массиве байт на C#

У меня есть бинарный файл, в котором лежат одноразмерные объекты (с именем пользователя) отсортированные по имени пользователяЕсть чужой...

311
Как задать точные координаты обьекта c#?

Как задать точные координаты обьекта c#?

Есть обьект, который двигается, и при прикосновении к стороне окна продолжает движение в другую сторонуТакже созданы обьекты(а1, а2), слева...

257