English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Você pode redefinir ou sobrecarregar os operadores embutidos no C#. Portanto, os programadores também podem usar os operadores de tipos personalizados. A sobrecarga de operadores é uma função com nome especial, acessada pela palavra-chave operator definidos seguidos pelo símbolo do operador. Como outras funções, a sobrecarga de operadores tem tipo de retorno e lista de parâmetros.
Por exemplo, veja a função a seguir:
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; }
A função acima implementa o operador de adição para a classe Box personalizada do usuário (+)。Ele adiciona os atributos de dois objetos Box e retorna o objeto Box somado.
O seguinte programa demonstra a implementação completa:
using System; namespace OperatorOvlApplication { class Box { private double length; // comprimento private double breadth; // largura private double height; // altura 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; } // sobrecarga + operador para somar dois objetos 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(); // declarar Box1de tipo Box Box Box2 = new Box(); // declarar Box2de tipo Box Box Box3 = new Box(); // declarar Box3de tipo Box double volume = 0.0; // volume // Box1 detalhamento Box1.setComprimento(6.0); Box1.setLargura(7.0); Box1.setHeight(5.0); // Box2 detalhamento Box2.setComprimento(12.0); Box2.setLargura(13.0); Box2.setHeight(10.0); // Box1 volume do Box volume = Box1.getVolume(); Console.WriteLine("Box1 volume: {0} // Box2 volume do Box volume = Box2.getVolume(); Console.WriteLine("Box2 volume: {0} // somar dois objetos Box3 Igual a Box1 + Box2; // Box3 volume do Box volume = Box3.getVolume(); Console.WriteLine("Box3 volume: {0} Console.ReadKey(); } } }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
Box1 Volume: 210 Box2 Volume: 1560 Box3 Volume: 5400
A tabela a seguir descreve as capacidades de sobrecarga de operadores no C#:
Operador | Descrição |
---|---|
+, -, !, ~, ++, -- | Esses operadores unários têm apenas um operando e podem ser sobrecarregados. |
+, -, *, /, % | Esses operadores binários têm dois operandos e podem ser sobrecarregados. |
==, !=, <, >, <=, >= | Esses operadores de comparação podem ser sobrecarregados. |
&&, || | Esses operadores lógicos de condição não podem ser sobrecarregados diretamente. |
+=, -=, *=, /=, %= | Esses operadores de atribuição não podem ser sobrecarregados. |
=, ., ?:, ->, new, is, sizeof, typeof | Estes operadores não podem ser sobrecarregados. |
Para expandir o exemplo discutido acima, vamos sobrecarregar mais operadores:
using System; namespace OperatorOvlApplication { class Box { private double length; // comprimento private double breadth; // largura private double height; // altura 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; } // sobrecarga + operador para somar dois objetos 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.comprimento < rhs.comprimento && lhs.altura < rhs.height && lhs.largura < rhs.largura) { status = true; } return status; } public static bool operator >(Box lhs, Box rhs) { bool status = false; if (lhs.comprimento > rhs.comprimento && lhs.altura > rhs.height && lhs.largura > rhs.largura) { status = true; } return status; } public static bool operator <=(Box lhs, Box rhs) { bool status = false; if (lhs.comprimento <= rhs.comprimento && lhs.altura <= rhs.height && lhs.largura <= rhs.largura) { status = true; } return status; } public static bool operator >=(Box lhs, Box rhs) { bool status = false; if (lhs.comprimento >= rhs.comprimento && lhs.altura >= rhs.height && lhs.largura >= rhs.largura) { status = true; } return status; } public override string ToString() { return String.Format("({0}, {1}, {2})", comprimento, largura, altura); } } class Tester { static void Main(string[] args) { Box Box1 = new Box(); // declarar Box1de tipo Box Box Box2 = new Box(); // declarar Box2de tipo Box Box Box3 = new Box(); // declarar Box3de tipo Box Box Box4 = new Box(); double volume = 0.0; // volume // Box1 detalhamento Box1.setComprimento(6.0); Box1.setLargura(7.0); Box1.setHeight(5.0); // Box2 detalhamento Box2.setComprimento(12.0); Box2.setLargura(13.0); Box2.setHeight(10.0); // usar o ToString() sobrecarregado para mostrar os dois caixas Console.WriteLine("Box1: {0}1.ToString()); Console.WriteLine("Box2: {0}2.ToString()); // Box1 volume do Box volume = Box1.getVolume(); Console.WriteLine("Box1 volume: {0} // Box2 volume do Box volume = Box2.getVolume(); Console.WriteLine("Box2 volume: {0} // somar dois objetos Box3 Igual a Box1 + Box2; Console.WriteLine("Box3: {0}3.ToString()); // Box3 volume do Box volume = Box3.getVolume(); Console.WriteLine("Box3 volume: {0} //comparando os caixas Se Box1 > Box2) Console.WriteLine("Box1 maior que Box2"); else Console.WriteLine("Box1 Não Maior que Box2"); Se Box1 < Box2) Console.WriteLine("Box1 Menor que Box2"); else Console.WriteLine("Box1 Não Menor que Box2"); Se Box1 Maior que Box2) Console.WriteLine("Box1 Maior ou Igual a Box2"); else Console.WriteLine("Box1 Não Maior ou Igual a Box2"); Se Box1 Menor ou Igual a Box2) Console.WriteLine("Box1 Menor ou Igual a Box2"); else Console.WriteLine("Box1 Não Menor ou Igual a Box2"); Se Box1 Diferente de Box2) Console.WriteLine("Box1 Diferente de Box2"); else Console.WriteLine("Box1 Igual a Box2"); Box4 Igual a Box3; Se Box3 Igual a Box4) Console.WriteLine("Box3 Igual a Box4"); else Console.WriteLine("Box3 Diferente de Box4"); Console.ReadKey(); } } }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
Box1:(6, 7, 5) Box2:(12, 13, 10) Box1 Volume: 210 Box2 Volume: 1560 Box3:(18, 20, 15) Box3 Volume: 5400 Box1 Não Maior que Box2 Box1 Menor que Box2 Box1 Não Maior ou Igual a Box2 Box1 Menor ou Igual a Box2 Box1 Diferente de Box2 Box3 Igual a Box4