Ha C # solo copiare i dati di campo sulla assegnazione ad un altro campo o si riferisce ai dati?
-
21-09-2019 - |
Domanda
Ad assegnare un campo all'altro, fa il C # è sufficiente copiare i dati sopra, o addirittura crea collegamento? In questo articolo c'è un esempio di struttura motore di gioco. Il codificatore non ha componenti contengono loro genitore. In C #, fanno solo contengono la copia genitore, o si riferiscono ad esso?
Esempio di codice:
class World
{
...
public void Update()
{
...
ent.OnAttach(this);
...
}
...
}
class Entity
{
...
public void OnAttach(World world)
{
world_ = world;
}
...
}
Potrebbe l'oggetto Entity ora accedere all'oggetto mondo e avere accesso ad esso è campi e metodi, come nel Artiče? (O ho capito male il codice?)
Soluzione
Perché il vostro tipo di dati World
è definito come un class
e non un struct
che significa che quando si assegna una variabile di quel tipo, a di riferimento per gli stessi dati vengono copiati.
In altre wrods, se quindi si utilizza world.SomeProperty = something
o world_.someProperty = something
saranno modificando lo stesso oggetto in memoria.
Se si cambia il tipo di dati per essere un struct
allora l'intera struttura dati verrà copiato e avrete due copie degli stessi dati.
Indipendentemente da come si definito i dati, una volta che hai un riferimento ai dati si può quindi accedere ai suoi metodi o proprietà. Quindi, sì, una volta che l'oggetto entità ha un riferimento al mondo degli oggetti è possibile accedere a qualsiasi metodo o proprietà su di essa (fintanto che non sono private).
Altri suggerimenti
Dipende dal tipo di World
. Se si tratta di un tipo di riferimento (una classe), il riferimento copiato punterà allo stesso oggetto e modificando così l'oggetto puntato dal nuovo riferimento influenzerà l'oggetto originale (verrà creato un nuovo oggetto). Questo è il caso del campione inviato. Il campo sarà semplicemente fare riferimento allo stesso oggetto World
.
Se il tipo World
è un tipo di valore, viene copiato (insieme al suo contenuto) e diverrà un valore completamente distinte, cambiamento che non alteri l'originale.
Come Entity Mondo sono di classe "(cioè i tipi di riferimento"), quindi avrebbero solo hanno riferimenti gli uni agli altri. Se uno era uno struct (vale a dire un "tipo di valore"), allora la cosa sarebbe enite essere copiato.
Si dovrebbe avere uno sguardo il passaggio per riferimento e passaggio per valore. Il vostro oggetto mondo è un passato per riferimento, in modo che stai passando un riferimento a una locazione di memoria in cui i dati di questo oggetto contiene risiede.
entità potrebbe ora metodi pubblici solo l'accesso dell'oggetto mondo, proprietà.