Domanda

Per un po 'di informazioni di base, ho un'applicazione che è in esecuzione in un ciclo e più che mai tick chiama un metodo Tick. Ci sono un sacco di classi che estendono una classe base e tutte hanno i propri metodi tick e vengono aggiunte a una catena di dipendenze in modo da dire quando la classe A viene chiamata e la sua catena contiene istanze di B e C, B.Tick viene chiamato , seguito da C.Tick e infine A.Tick.

Quindi in pseudo codice il mio tipo di classe assomiglia a questo:

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 funziona bene e ottiene sempre il valore corretto. Il problema è che immagino che non sia possibile memorizzare un riferimento a un'altra variabile in una classe, quindi quando faccio una nuova C (riferimento a una); e il contruttore per C sta impostando una variabile di classe su una, in seguito dopo che una è stata aggiornata in A è come se C non sapesse più che dovrebbe ancora puntare verso una (che è ora aggiornata) ed è semplicemente vuota (come in origine era all'interno del costruttore). Qualche idea su come ottenere ciò che sto cercando di fare, senza dover usare i puntatori C # e il codice non sicuro? Grazie, speriamo abbia senso :)

Modifica: Apparentemente le persone non possono rispondere alle domande con pseudo codice confuso completamente estraneo alla domanda reale, quindi il cambiamento si estende a:

Modifica 2: classe 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 
}
È stato utile?

Soluzione

Poiché one è una ArrayList, puoi solo passarlo come riferimento. Apparentemente ora lo stai passando come riferimento a un riferimento al costruttore. Potrebbe non essere necessario quel ref .

Ma mostra un'idea più completa di ciò che stai cercando di realizzare.

Modifica:

Dopo aver visto la tua classe C, non è necessario il ref . c condividerà l'istanza di ArrayList che A chiama one .

Questo sembra ridursi al problema generale di riferimento / tipo di valore in .NET. Riassumendo:

  • le istanze di oggetti non hanno un nome e non possono (fisicamente) passare affatto come parametro.
  • accedi sempre a un'istanza tramite un riferimento. Nel tuo codice, one (2x), two , local sono tutti riferimenti a istanze di Arraylist.
  • i riferimenti stessi si comportano come valueetypes, ovvero assegnazione significa copia.

Per ulteriori informazioni sui tipi di riferimento / tipi di valore, cerca "copia semantica" ed evita le pubblicazioni che iniziano con "tipi di valore esistenti nello stack".

Altri suggerimenti

Non c'è nulla che ti impedisca di farlo. Se è o meno una buona idea è un'altra domanda però. In generale, consiglierei di provare a evitare di cambiare lo stato tra le chiamate di metodo se puoi evitarlo. Naturalmente, l'espressione chiave è " se puoi evitarlo " ;. : -)

  

non è possibile memorizzare un riferimento a un'altra variabile in una classe

Puoi, le persone lo fanno sempre. Basta assegnarlo a un campo (privato).

  

quindi quando faccio una nuova C (rif. una); [snip /] più tardi dopo che uno è stato aggiornato in A è come se C non sapesse più che dovrebbe ancora puntare verso uno

In realtà, lo sa, ma dovresti assegnare uno a un campo membro. L'assegnazione agli oggetti non è altro che l'impostazione di un riferimento all'oggetto. Cambiando l'oggetto, li cambia ovunque tu l'abbia assegnato:

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

PS: dato che stavi postando pseudocodice, spero che non ti dispiaccia che mi semplifichi un po '. Se ho frainteso la tua domanda, ti preghiamo di ignorare (e forse chiarire, se possibile).

PPS: rileggere il tuo codice (modificato) e provare ancora a capire qual è il problema, non sembra esserci nulla che impedisca a C di mantenere un membro con un riferimento a A e la chiamata di a.Add rifletterà ovviamente anche la variabile membro in c . In effetti, qui non è necessario ref .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top