Estoy de acuerdo con las respuestas de Jon Skeet et al. acerca de cómo permitir métodos de extensión "ref. this" podría hacer que el código sea más oscuro. Pero si observa algunos espacios de nombres en .Net Framework, es común que un método invocado en una estructura lo altere.
Tome, por ejemplo, las estructuras del Sistema.Dibujo (Punto, Rectángulo, etc.). Cada uno de estos tiene métodos (por ejemplo, desplazamiento, inflado, etc.) que mutan la estructura en sí. No estoy diciendo que esto sea una buena idea, de hecho personalmente encuentro muy molesto que Offset, Inflate, etc. muten las estructuras mismas en lugar de devolver las nuevas, y sé que algunos de ustedes se oponen a la idea de estructuras mutables en general.
Dudo que haya ningún caso donde invocar un método de un tipo de referencia cambiará la referencia (a menos que sea con la clase String
, donde puedo imaginar que podría haber algún compilador mágico para cambiar las referencias para realizar el interinato, etc.). Por lo tanto, tiene sentido evitar que "esta referencia" se use con tipos de referencia, ya que cambiar una referencia sería un efecto secundario completamente no estándar de llamar a un método.
Pero en lo que respecta a las estructuras, permitir "esta referencia" no disminuiría significativamente la legibilidad del código más que Rectangle.Inflate, etc, y proporcionaría el único medio para "simular" ese tipo de comportamiento con una función de extensión.
Así como una nota lateral, aquí es un ejemplo en el "presente ref" podría ser útiles, y en mi humilde opinión sigue siendo legible:
void SwapWith<T>(this ref T x, ref T y) {
T tmp = x; x = y; y = tmp;
}
¿Está seguro de que es necesario un 'ref' explícito? Esperaría que sea "autogenerado" por 'this': los métodos de extensión sin referencia no tendrían ningún sentido. –
Pero no son referencias si no me equivoco. – Hun1Ahpu
Los parámetros @MarcelJackwerth ref no son lo mismo que los parámetros de tipo de referencia. Un parámetro ref pasa la referencia (o puntero) de la persona que llama. Con ref, puede actualizar la referencia para señalar a otro objeto. Sin él (para los tipos de referencia) puede actualizar el objeto en sí, pero no la referencia a él. – xr280xr