2016-04-15 15 views
-2

Ich erstelle ein Objekt durch Werte aus anderen object.Like mit, dass:C# Änderungen Wert einer Objekteigenschaft von anderen

MAP.cs

int[][] map = {......}; 
Mob m = new Mob(0,0,map); 

Und ruft Mob Klasse Funktion Verschieben()

m.Move(); 

Funktion Move sieht wie folgt aus:

int xp = (int)Math.Floor(x/32); 
int yp = (int)Math.Floor(y/32); 
int[] result = lookForClosest(xp, yp); 
this.nextX = result[1]; 
this.nextY = result[0]; 
map[this.nextY][this.nextX] = 1; 

Funktionen werden mit DispatcherTimer in einer anderen Klasse (MainWindow) aufgerufen Das Ergebnis dieser Anwendung ist, dass Map-Eigenschaft in MAP-Klasse geändert wird. Die einzige Änderung sollte in der Map-Eigenschaft des Mob-Objekts vorgenommen werden. Irgendeine Erklärung und mögliche Reparatur?

+2

Haben Sie versucht, eine Kopie des 'map' Arrays an den' Mob' Konstruktor zu übergeben? – user1620220

+0

Wie kann es gemacht werden? – Berrigan

Antwort

1

Arrays sind Referenz Typen, also wenn Sie

Mob m = new Mob(0,0,map); 

rufen Sie passieren eine Referenz auf das Array mit dem Mob Konstruktor und alle Änderungen, die Sie in der Mob Klasse auf das Array machen im Quell-Array reflektiert werden. Sie können dies eine von zwei Arten ändern:

  1. Clone das Array, bevor es der Mob Klasse oder
  2. Clone das Array innerhalb des Mob Konstruktor übergeben.

Aus Eigentums Sicht ist die Frage - sollten Kunden erwarten Änderungen an der Reihe, um zu sehen, oder ist das Array eher ein „Seed“ -Eingang, die innerhalb der Klasse geändert werden kann?

Beachten Sie auch, dass Sie ein Array haben von Arrays, so dass Sie brauchen nicht nur die „äußere“ Array zu schließen, aber jeder der Anordnungen in ihm:

public T[][] Clone<T>(T[][] source) 
{ 
    T[][] output = new T[source.Length][]; 
    for(int i=0; i<source.Length; i++) 
     output[i] = (T[])source[i].Clone(); 

    return output; 
} 

oder wenn Sie bequem sind mit Linq:

public T[][] Clone<T>(T[][] source) 
{ 
    return source.Select(a => (T[])a.Clone()).ToArray(); 
} 
+0

Die "Samen eins". Ich habe ausgeführt, dass es die Referenz übergibt, aber sollte das Array mit for-Schleifen geklont werden, oder gibt es einen besseren Weg? – Berrigan

+1

Definieren Sie "besser". Eine 'for'-Schleife ist völlig in Ordnung, oder Sie können eine Linq-Abfrage verwenden. –

Verwandte Themen