¿Conveniencia?
Más o menos, sí. Considere el caso de cuando tiene un objeto similar a un número (por ejemplo, un Complex
) en el que hace cálculos. Claramente, la escritura de código, tales como:
Complex result = c1 * new Complex(2) + new Complex(32);
es muy molesto y difícil de leer. Las conversiones implícitas ayudan aquí (una alternativa serían las sobrecargas del operador en este ejemplo, pero eso generaría muchas sobrecargas similares).
¿Hay una pauta para esto?
Proporcione la menor cantidad de conversiones implícitas posible, ya que pueden ocultar problemas. La conversión implícita reduce la explicitud en la misma cantidad por la cual aumentan la concisión. Algunas veces esto es bueno, pero a veces no.
Me parece que lo mejor para restringir las conversiones implícitas a muy tipos similares, como los objetos de números, como en el ejemplo anterior: un int
esencialmente es-un Complex
(desde un punto de vista matemático, incluso si no está modelada a través herencia), por lo tanto, una conversión implícita tiene sentido.
En VB, una conversión implícita se llama “Widening
” (en contraposición a Narrowing
, que es explicit
) y esto lo describe así: no se pierde información en el curso de la conversión.
Además, un operador es esencialmente una función de constructor y tiene (algunas de) las ventajas habituales de una función de constructor sobre un constructor: es decir, puede reutilizar valores almacenados en caché en lugar de crear siempre instancias nuevas.
Considera mi ejemplo de Complex
. Es posible que queramos almacenar en caché los valores para los números complejos se usan con frecuencia:
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);
}
}
Por supuesto, si este micro-optimización es eficaz, es otra cuestión.
Gracias, ¿cómo lo harías para las sobrecargas del operador que ayudarían al tipo Complejo? Necesita poder editar el tipo int, ¿verdad? –
@Joan: No, ya que puede implementar operadores en ambas direcciones: * desde * su tipo personalizado y * a * su tipo personalizado. En mi ejemplo, simplemente haga que 'Complex' implemente un operador' implicit operator Complex (int value) '. –
Gracias, lo entiendo ahora. –