Pregunta

¿Hay una manera de forzar la palabra clave this para actuar como un argumento ref? Me gustaría pasar a un visitante que modifica varias propiedades en el objeto, pero esto sólo quiere actuar como un parámetro de valor.

Código de objeto:

public void Accept(Visitor<MyObject> visitor)
{
    visitor.Visit(this);
}

Código de Visitante:

public void Visit(ref Visitor<MyObject> receiver)
{
    receiver.Property = new PropertyValue();
    receiver.Property2 = new PropertyValue();
}
¿Fue útil?

Solución

Ya que no está realmente cambiando lo que se refiere a receiver no hay necesidad de que la palabra clave ref. Sin embargo, si ese hubiera sido el caso, usted no será capaz de hacer this se refieren a otra instancia.

Con el fin de pasar this como parámetro ref, que tendría que escribir así:

Visit(ref this);

Ese código no se compilará: "No se puede pasar '' como un argumento ref o fuera, ya que es de sólo lectura"

Otros consejos

Si su Visitor<T> es una clase, entonces no se necesita la palabra clave ref.

Toda la información dentro de una clase se cambia de forma automática si se cambian en un método

Parece que tienes una respuesta a su pregunta más amplia ya. Pero vamos a considerar este uno de todos modos.

  

¿Hay una manera de forzar la palabra clave this para actuar como un argumento ref?

Sí. El trabajo a través lógicamente.

  • Un argumento ref hace un alias de variables .
  • "this" no es una variable en un tipo de referencia
  • "este" es una variable en un tipo de valor
  • por lo tanto, la única manera de pasar un "ref este" es de un método de instancia de un tipo de valor.

Y, de hecho, es la forma en que "este" se implementa en un tipo de valor detrás de las escenas. Cuando se tiene una (! Peores prácticas en realidad no hacer esto) Tipo de valor mutable:

struct S
{
    private int x;
    public void M()
    {
        this.x = 123;
    }
}
...
S s = new S();
s.M();

Desde las instancias de S son pasa por valor ¿Cómo es que muta M s? s se deben pasar por referencia! De hecho, el código que generamos es como si usted había escrito algo 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. Si lo hace, es casi siempre un idea terrible pero es legal.

lo que realmente necesita que el árbitro de palabras clave?

ref sería útil si cambia ejemplo receptor p.ej. receptor = null;

lo contrario

receiver.Property es accesible también sin ref palabra clave

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top