Porque el operador -
para la manipulación de cadenas no tiene suficiente "cohesión semántica". Los operadores solo deben estar sobrecargados cuando esté absolutamente claro qué hace la sobrecarga con sus operandos, y la resta de cadenas no cumple con esa barra.
En consecuencia, se prefieren las llamadas a métodos:
public string Remove(string source, string toRemove)
public string Replace(string source, string oldValue, string newValue)
En el lenguaje C #, usamos +
para la concatenación de cadenas porque el formulario
var result = string1 + string2 + string3;
en lugar de
var result = string.Concat(string1, string2, string3);
es conveniente y posiblemente más fácil de leer, aunque una llamada de función es probablemente más "correcta", desde un punto de vista semántico.
El operador +
solo puede significar una cosa en este contexto. Esto no es tan cierto para -
, ya que la noción de restar cadenas es ambigua (la función call Replace(source, oldValue, newValue)
con ""
, ya que el parámetro newValue
elimina todas las dudas y la función se puede usar para alterar las subcadenas, no solo eliminarlos).
El problema, por supuesto, es que la sobrecarga del operador depende de los tipos que se le pasan al operador, y si pasa una cadena donde debería haber un número, puede obtener un resultado que no esperaba. Además, para muchas concatenaciones (es decir, en un bucle), es preferible un objeto StringBuilder
, ya que cada uso de +
crea una cadena completamente nueva, y el rendimiento puede verse afectado. Así que el operador +
ni siquiera es apropiado en todos los contextos.
Hay sobrecargas de operadores que tienen mejor cohesión semántica que el operador +
para la concatenación de cadenas. Aquí hay uno que agrega dos números complejos:
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
}