Perché l'operatore -
per la manipolazione delle stringhe non ha abbastanza "coesione semantica". Gli operatori dovrebbero essere sovraccaricati solo quando è assolutamente chiaro che cosa fa il sovraccarico con i suoi operandi e la sottrazione di stringhe non soddisfa quella barra.
Di conseguenza, le chiamate ai metodi sono preferite:
public string Remove(string source, string toRemove)
public string Replace(string source, string oldValue, string newValue)
Nel linguaggio C #, usiamo +
per la concatenazione di stringhe perché il modulo
var result = string1 + string2 + string3;
invece di
var result = string.Concat(string1, string2, string3);
è comodo e probabilmente più facile da leggere, anche se una chiamata di funzione è probabilmente più "corretta", da un punto di vista semantico.
L'operatore +
può significare solo una cosa in questo contesto. Questo non è vero per -
, poiché la nozione di sottrazione di stringhe è ambigua (la chiamata di funzione Replace(source, oldValue, newValue)
con ""
come il parametro newValue
rimuove tutti i dubbi e la funzione può essere utilizzata per modificare le sottostringhe, non solo rimuoverli).
Il problema, ovviamente, è che il sovraccarico dell'operatore dipende dai tipi trasmessi all'operatore e se si passa una stringa in cui dovrebbe essere stato un numero, si può ottenere un risultato che non si aspettava. Inoltre, per molte concatenazioni (ad esempio in un ciclo), è preferibile un oggetto StringBuilder
, poiché ogni utilizzo di +
crea una nuova stringa e le prestazioni possono risentirne. Quindi l'operatore +
non è nemmeno appropriato in tutti i contesti.
Esistono sovraccarichi dell'operatore con una coesione semantica migliore rispetto all'operatore +
per la concatenazione di stringhe. Ecco uno che aggiunge due numeri complessi:
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
}