Suena como que tienes una respuesta a su pregunta más amplia ya. Pero consideremos esto de todos modos.
¿Hay alguna manera de forzar a esta palabra clave a actuar como argumento de referencia?
Sí. Trabaja lógicamente.
- Un argumento ref hace una alias para una variable .
- "este" no es una variable en un tipo de referencia
- "este" es una variable en un tipo de valor
- , por tanto, la única manera de pasar un "ref este" es de un método de instancia de un tipo de valor .
Y de hecho, así es como "esto" se implementa en un tipo de valor detrás de las escenas. Cuando tienes una (¡peor práctica!en realidad no hacer esto) mutable tipo de valor:
struct S
{
private int x;
public void M()
{
this.x = 123;
}
}
...
S s = new S();
s.M();
Desde las instancias de S se pasan por valor cómo es que muta M s? s debe pasar por referencia! De hecho, el código que generamos es como si usted había escrito algo así como:
struct S
{
private int x;
public static void M(ref S THIS)
{
THIS.x = 123;
}
}
...
S s = new S();
S.M(ref s);
En resumen, un "presente" en una estructura que ya se pasa como un parámetro de referencia, por lo que no hay ningún problema que pasa a lo largo de nuevo. Hacerlo es casi siempre una idea terrible pero es legal.
Sí, tienes razón. Pero quiero que la clase original retenga los cambios realizados por el visitante. Si no paso como ref, ¿no solo modificaré las propiedades de una * copia * de? –
grefly
@grefly: No si "esto" es una clase. Siempre que no "visite" una estructura personalizada (tipos de valor), no se requiere una referencia. –
¡Gracias, tienes razón! – grefly