Вы можете переопределить или перегрузить большинство встроенных операторов доступных в C#. Таким образом программист может использовать операторы с пользовательскими типами. Перегруженные операторы это функции со специальнымы именами, за которыми следует ключевое слово operator, а также символ для оператора. Как и любая другая функция, перегруженный оператор имеет тип возвращаемого значения и список параметров.
Например, посмотрите на следующую функцию:
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
Выше функция реализует оператор сложения (+) для пользовательского класса Box. Это добавляет атрибуты для двух объектов Box и возвращает полученный объект Box.
Следующая программа показывает полную реализацию:
using System;
namespace OperatorOvlApplication
{
class Box
{
private double length; // длина коробки
private double breadth; // ширина коробки
private double height; // высота коробки
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// перегрузка оператора + для сложения двух объектов Box
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // объявление Box1 типа Box
Box Box2 = new Box(); // объявление Box2 типа Box
Box Box3 = new Box(); // объявление Box3 типа Box
double volume = 0.0; // переменная для хранения объема коробки
// определение Box1
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// определение Box2
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// объем Box1
volume = Box1.getVolume();
Console.WriteLine("Объем Box1 : {0}", volume);
// объем Box2
volume = Box2.getVolume();
Console.WriteLine("Объем Box2 : {0}", volume);
// сложение двух объектов
Box3 = Box1 + Box2;
// объем Box3
volume = Box3.getVolume();
Console.WriteLine("Объем Box3 : {0}", volume);
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Объем Box1 : 210
Объем Box2 : 1560
Объем Box3 : 5400
В следующей таблице приведены возможности перегрузки операторов C#:
Операторы | Описание |
---|---|
+, -, !, ~, ++, -- | Эти унарные операторы принимают один операнд и могут быть перегружены. |
+, -, *, /, % | Эти бинарные операторы принимают один операнд и могут быть перегружены. |
==, !=, <, >, <=, >= | Операторы сравнения могут быть перегружены |
&&, || | Условные логические операторы не могут быть перегружены непосредственно. |
+=, -=, *=, /=, %= | Операторы присваивания не могут быть перегружены. |
=, ., ?:, ->, new, is, sizeof, typeof | Эти операторы не могут быть перегружены. |
В свете вышеизложенного обсуждения, давайте расширим предыдущий пример, и перегрузки нескольких операторов:
using System;
namespace OperatorOvlApplication
{
class Box
{
private double length; // длина коробки
private double breadth; // ширина коробки
private double height; // высота коробки
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// перегрузка оператора + для сложения двух объектов Box
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
public static bool operator == (Box lhs, Box rhs)
{
bool status = false;
if (lhs.length == rhs.length && lhs.height == rhs.height
&& lhs.breadth == rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator !=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length != rhs.length || lhs.height != rhs.height
|| lhs.breadth != rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length < rhs.length && lhs.height
< rhs.height && lhs.breadth < rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length > rhs.length && lhs.height
> rhs.height && lhs.breadth > rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length <= rhs.length && lhs.height
<= rhs.height && lhs.breadth <= rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length >= rhs.length && lhs.height
>= rhs.height && lhs.breadth >= rhs.breadth)
{
status = true;
}
return status;
}
public override string ToString()
{
return String.Format("({0}, {1}, {2})", length, breadth, height);
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // объявление Box1 типа Box
Box Box2 = new Box(); // объявление Box1 типа Box
Box Box3 = new Box(); // объявление Box1 типа Box
Box Box4 = new Box();
double volume = 0.0; // переменная для хранения объема коробки
// определение Box1
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// определение Box2
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
//Коробки отображения, используя перегруженный ToString():
Console.WriteLine("Box 1: {0}", Box1.ToString());
Console.WriteLine("Box 2: {0}", Box2.ToString());
// объем Box1
volume = Box1.getVolume();
Console.WriteLine("Объем Box1 : {0}", volume);
// объем Box2
volume = Box2.getVolume();
Console.WriteLine("Объем Box2 : {0}", volume);
// сложение двух объектов
Box3 = Box1 + Box2;
Console.WriteLine("Box 3: {0}", Box3.ToString());
// объем Box3
volume = Box3.getVolume();
Console.WriteLine("Объем Box3 : {0}", volume);
//comparing the boxes
if (Box1 > Box2)
Console.WriteLine("Box1 больше чем Box2");
else
Console.WriteLine("Box1 не больше чем Box2");
if (Box1 < Box2)
Console.WriteLine("Box1 меньше чем Box2");
else
Console.WriteLine("Box1 не меньше чем Box2");
if (Box1 >= Box2)
Console.WriteLine("Box1 больше или равен Box2");
else
Console.WriteLine("Box1 не больше или равен Box2");
if (Box1 <= Box2)
Console.WriteLine("Box1 меньше или равен Box2");
else
Console.WriteLine("Box1 не меньше или равен Box2");
if (Box1 != Box2)
Console.WriteLine("Box1 не равен Box2");
else
Console.WriteLine("Box1 равен Box2");
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine("Box3 равен Box4");
else
Console.WriteLine("Box3 не равен Box4");
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Box 1: (6, 7, 5)
Box 2: (12, 13, 10)
Объем Box1 : 210
Объем Box2 : 1560
Box 3: (18, 20, 15)
Объем Box3 : 5400
Box1 не больше чем Box2
Box1 меньше чем Box2
Box1 не больше или равен Box2
Box1 меньше или равен Box2
Box1 не равен Box2
Box3 равен Box4