Convenienza?
Più o meno, sì. Considera il caso in cui hai un oggetto simile al numero (ad esempio, uno Complex
) su cui esegui i calcoli. Chiaramente, scrivere un codice come:
Complex result = c1 * new Complex(2) + new Complex(32);
è molto fastidioso e difficile da leggere. Le conversioni implicite aiutano qui (un'alternativa sarebbe il sovraccarico dell'operatore in questo esempio, ma ciò porterebbe a molti sovraccarichi simili).
Esiste una linea guida per questo?
Fornire il minor numero possibile di conversioni implicite, poiché potrebbero nascondere problemi. La conversione implicita riduce la chiarezza dello stesso importo con il quale aumenta la tersezza. A volte questo è buono, ma a volte no.
Trovo meglio per limitare le conversioni implicite di tipi molto simili, come ad esempio gli oggetti numero-come nel mio esempio di cui sopra: un int
essenzialmente is-a Complex
(dal punto di vista matematico, anche se non è modellata via eredità), quindi una conversione implicita ha un senso.
In VB, una conversione implicita viene chiamato “Widening
” (al contrario di Narrowing
, che è explicit
) e questo descrive bene: nessuna informazione viene persa nel corso della conversione.
Inoltre, un operatore è essenzialmente una funzione builder e presenta (alcuni dei) vantaggi usuali di una funzione builder su un costruttore: vale a dire, può riutilizzare i valori memorizzati nella cache invece di creare sempre nuove istanze.
Considerare il mio esempio Complex
. Si consiglia di memorizzare nella cache i valori per i numeri complessi utilizzati più spesso:
Class Complex {
// Rest of implementation.
private static Complex[] cache = new[] {
new Complex(-1), new Complex(0), new Complex(1) };
public implicit operator Complex(int value) {
if (value >= -1 && value <= 1)
return cache[value];
else
return new Complex(value);
}
}
Naturalmente, se questo micro-ottimizzazione è efficace è un'altra questione.
Grazie, come lo faresti per i sovraccarichi dell'operatore che potrebbero aiutare il tipo Complesso? Devi essere in grado di modificare il tipo int, giusto? –
@Joan: No, dal momento che è possibile implementare gli operatori in entrambe le direzioni: * dal * tipo personalizzato e * al * tipo personalizzato. Nel mio esempio, semplicemente 'Complex' implementa un operatore implicito Operatore' 'Compl (valore int)'. –
Grazie ho capito ora. –