Un operador en C# no es más que un símbolo formado por uno o más
caracteres que permite realizar una determinada operación entre uno o más datos
y produce un resultado. En el Tema 4:
Aspectos Léxicos ya hemos visto que C# cuenta con un buen número de
operadores que permiten realizar con una sintaxis clara e intuitiva las
operaciones comunes a la mayoría de lenguajes (aritmética, lógica, etc) así como
otras operaciones más particulares de C# (operador is, operador stackalloc,
etc.)
En C# viene predefinido el
comportamiento de sus operadores cuando se aplican a ciertos tipos de datos.
Por ejemplo, si se aplica el operador + entre dos objetos int devuelve su suma,
y si se aplica entre dos objetos string devuelve su concatenación. Sin embargo,
también se permite que el programador pueda definir el significado la mayoría
de estos operadores cuando se apliquen a objetos de tipos que él haya definido,
y esto es a lo que se le conoce como redefinición
de operador.
Nótese que en realidad la
posibilidad de redefinir un operador no aporta ninguna nueva funcionalidad al
lenguaje y sólo se ha incluido en C# para facilitar la legibilidad del código.
Por ejemplo, si tenemos una clase Complejo
que representa números complejos podríamos definir una función Sumar() para sus objetos de modo que a través de ella
se pudiese conseguir la suma de dos objetos de esta clase como muestra este
ejemplo:
Complejo
c1 = new Complejo(3,2); // c1 = 3 + 2i
Complejo
c2 = new Complejo(5,2); //
c2 = 5 + 2i
Complejo
c3 = c1.Sumar(c2); // c3 = 8 + 4i
Sin embargo, el código sería
mucho más legible e intuitivo si en vez de tenerse que usar el método Sumar() se redefiniese el significado del operador + para que al aplicarlo entre objetos Complejo devolviese su suma. Con ello, el código
anterior quedaría así:
Complejo
c1 = new Complejo(3,2); // c1 = 3 +
2i
Complejo
c2 = new Complejo(5,2); // c2 = 5 +
2i
Complejo
c3 = c1 + c2; // c3 = 8 + 4i
Ésta es precisamente la utilidad
de la redefinición de operadores: hacer más claro y legible el código, no
hacerlo más corto. Por tanto, cuando se redefina un operador es importante que
se le dé un significado intuitivo ya que si no se iría contra de la filosofía
de la redefinición de operadores. Por ejemplo, aunque sería posible redefinir
el operador *
para que cuando se aplicase entre objetos de tipo Complejo
devuelva su suma o imprimiese los valroes de sus operandos en la ventana de
consola, sería absurdo hacerlo ya que más que clarificar el código lo que haría
sería dificultar su comprensión.
De todas formas, suele ser buena
idea que cada vez que se redefina un operador en un tipo de dato también se dé
una definición de un método que funcione de forma equivalente al operador. Así
desde lenguajes que no soporten la redefinición de operadores también podrá
realizarse la operación y el tipo será más reutilizable.