Pregunta

Para obtener un poco de información general, tengo una aplicación que se ejecuta en un bucle, y siempre marca un método llamado Tick. Hay un montón de clases que extienden una clase base y todas tienen sus propios métodos de marcación, y se agregan a una cadena de dependencia para decir que cuando se llama a la clase A y su cadena tiene instancias de B y C, B.Tick se llama , seguido de C.Tick y, finalmente, A.Tick.

Entonces, en pseudocódigo, mi clase se ve así:

public class A : Super
Super b;
Super c;
ArrayList one;
ArrayList two;

tick(){
    one.Add(b.LastValue);
    two.Add(c.LastValue);
            ... do something with one and two ...
}

A(){
    b = new B(some other array list);
    c = new C(ref one);
}

B funciona bien y siempre obtiene el valor correcto. El problema es que supongo que no puedes almacenar una referencia a otra variable en una clase, así que cuando hago una nueva C (referencia uno); y el constructor para C está estableciendo una variable de clase en uno, más tarde, después de que uno se actualiza en A, es como C ya no sabe que todavía se supone que apunta hacia uno (que ahora se actualiza) y está vacío (como originalmente estaba dentro del constructor). ¿Alguna idea sobre cómo lograr lo que estoy buscando hacer, sin tener que usar punteros C # y código inseguro? Gracias, espero que tenga sentido :)

Editar: Aparentemente, las personas no pueden responder preguntas con un pseudocódigo confuso que no tiene ninguna relación con la pregunta real, por lo que el cambio se extiende a:

Editar 2: clase C

...
ArrayList local;
...
C(ref ArrayList one){
    local = one;
}

Tick(){
   LastValue = local[0] + 5; //not actual formula, just shows trying to use a referenced variable 
}
¿Fue útil?

Solución

Dado que one es una ArrayList, puede solo pasarla como referencia. Ahora aparentemente lo pasa como una referencia a una referencia al constructor. Es posible que no necesite esa ref .

Pero por favor muestre una idea más completa de lo que está tratando de lograr.

Editar:

Después de ver su clase C, no hay necesidad de ref . c compartirá la instancia de ArrayList que A llama a one .

Esto parece reducirse al problema general de tipo de referencia / tipo de valor en .NET. Para resumir:

  • las instancias de objetos no tienen nombre y no se pueden pasar (físicamente) como parámetro en absoluto.
  • siempre accedes a una instancia a través de una referencia. En su código, one (2x), two , local son referencias a instancias de Arraylist.
  • las referencias mismas se comportan como tipos de valor, es decir, la asignación significa copiar.

Para obtener más información sobre los tipos de referencia / tipos de valor, busque 'copiar semántica' y evite las publicaciones que comienzan con 'existen tipos de valor en la pila'.

Otros consejos

No hay nada que te impida hacer esto. Sin embargo, si es una buena idea es otra pregunta. En general, recomendaría tratar de evitar cambiar el estado entre llamadas a métodos si puede evitarlo. Por supuesto, la expresión clave allí es "si puede evitarlo". :-)

  

no puede almacenar una referencia a otra variable en una clase

Puedes, la gente lo hace todo el tiempo. Simplemente asígnelo a un campo (privado).

  

así que cuando hago una nueva C (referencia uno); [snip /] más tarde después de que uno se actualiza en A, es como si C ya no supiera que todavía se supone que apunta hacia uno

En realidad, lo sabe, pero debe asignar one a un campo miembro. Asignar a objetos no es más que establecer una referencia al objeto. Cambiando el objeto, los cambia en todas partes donde lo haya asignado:

class A
{
    public string Hello { get; set; }
}

class C
{
    private A myA;
    public C(A a) { myA = a; }
    public A GetMyA() { return myA; }
}

// somewhere else:
A someA = new A();
someA.Hello = "Hello World";
C someC = new C(someA);
someA.Hello = "Other World";
Console.WriteLine(someC.GetMyA().Hello);

// this will print "Other World" and not "Hello World" as you suggest

PD: como estabas publicando pseudocódigo, espero que no te importe que lo simplifique un poco. Si no entendí bien su pregunta, entonces ignore (y tal vez aclare, si es posible).

PPS: releyendo su código (editado) y aún tratando de descubrir cuál es el problema, parece que no hay nada que evite que C en su código mantenga a un miembro con una referencia a A y llamar a a.Add obviamente también reflejará la variable miembro en c . De hecho, no hay necesidad de ref aquí.

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