Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

28.12.2013, 18:01

Array exakt kopieren (C#)

Hallo Community,

ich habe eine Klasse, diese hat verschiedene Byte Attribute. Nun habe ich ein zwei Dimensionales Array werte[,] vom Datentyp Messwert, dass ich exakt kopieren will, also keine Referenz auf das alte Array, sondern ein neues Array mit den selben Werten.

Ich mache das bis jetzt so:

C#-Quelltext

1
Messwert[,] alteWerte = (Messwert[,]) werte.Clone()



Funktioniert das so, oder habe ich dann irgendwie wieder nur Referenzen?
In der Dokumentation steht "to get a shallow copy". Was bedeutet das?

Danke schon mal für eure Hilfe.

Edit:
Und die Klasse Messwert hat noch ein paar andere Attribute aus anderen Klassen, die aber auch wiederum nur Attribute vom Typ Byte haben. Werden diese dann auch mit kopiert?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

28.12.2013, 18:05

ich habe eine Klasse, diese hat verschiedene Byte Attribute.

Bitte vorsichtig mit dem Begriff "Attribut" sein.
Der hat in C# eine ganz andere Bedeutung als das, was du meinst.

In der Dokumentation steht "to get a shallow copy". Was bedeutet das?

https://www.google.de/search?q=shallow+copy

3

28.12.2013, 18:09

A shallow copy of an Array copies only the elements of the Array, whether they are reference types or value types, but it does not copy the objects that the references refer to.


EDIT: Zu langsam
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

28.12.2013, 18:10

Wenn Messwert ein struct ist (was sinnvoll wäre), gibt es kein Problem.
Ist es hingegen eine class (was bescheuert wäre), musst du die einzelnen Objekte in dem Array einzeln klonen.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

5

28.12.2013, 18:11

Ok, sorry das mit den Attributen bin ich eigentlich aus dem Informatikunterricht gewohnt (11. Klasse), irgendwas C# spezifisches meinte ich nicht.

Gibt es dann eine einfache Möglichkeit, eine "deep copy" zu erstellen?

Edit: Ich war zu langsam... Hier noch mal ausführlich:


Es gibt mehrere Klassen, ungefähr so:


Und jetzt würde ich gerne ein zwei dimensionales Array von Klasse 1 tief kopieren.
Wie könnte ich das am besten machen?

Edit2:
Struct habe ich noch nicht verwendet, ich glaube das kann ich schlecht umbauen, da Klasse 1 und Klasse 2 auch noch Methoden haben.
Ich muss also selbst eine Kopierfunktion basteln, da gibts nichts automatisches für diesen Fall wenn ich euch richtig verstehe, oder?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »MitgliedXYZ« (28.12.2013, 18:21)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

28.12.2013, 18:21

Schau dir nochmal meinen Beitrag direkt über deinem letzten Beitrag an.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

28.12.2013, 18:25

Die Frage ist auch, ob du überhaupt eine tiefe Kopie brauchst ...
Willst du Messwerte nachträglich verändern, die dann in der Kopie oder im Original nicht verändert werden sollen?

Mach Messwert doch einfach zu einem struct (für zwei Bytes gleich eine ganze Klasse ist Overkill, Messwert ist ein typischer Fall von "simple Daten"). Dann kannst du Clone nutzen und alles ist gut.

Ansonsten, wenn Messwert unbedingt eine class sein muss, dann musst du halt deine Messwert-Instanzen kopieren. Also für jeden Messwert eine neue Instanz erzeugen, der du dieselben zwei Bytes gibst wie die Originalinstanz.

So schwer kann das doch nicht sein?!
Ich dachte eigentlich, du wärst schon ein bisschen erfahren im Programmieren.

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

8

28.12.2013, 18:26

In C# wird in Referenztypen und Wertetypen unterschieden. Wie David schon sagte sind Klassen Referenztypen und Strukturen Wertetypen. Um es dir einfach zu machen kannst du deine Messwerte in Strukturen speichern und kopierst damit dann die tatsächlichen Objekte (was einer tiefen Kopie entspricht) anstatt Referenzen.

PS: Für dich könnte ein Kopierkonstruktor praktisch sein.
Liebe Grüße,
René

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

28.12.2013, 18:31

Struct habe ich noch nicht verwendet, ich glaube das kann ich schlecht umbauen, da Klasse 1 und Klasse 2 auch noch Methoden haben.

Auch structs können Methoden haben.
In deinem Fall ist struct wirklich dringend angebracht.

Ich muss also selbst eine Kopierfunktion basteln, da gibts nichts automatisches für diesen Fall wenn ich euch richtig verstehe, oder?

Es gibt schon etwas. Das wäre für diesen Fall aber maßlos übertrieben.
Du tust ja geradezu so, als sei es extrem aufwendig sowas zu programmieren. Das lässt sich aber wirklich in ein paar Zeilen Code erledigen.

Und wie gesagt:
Wenn du structs benutzt, brauchst du nur die Clone-Methode. Sonst nichts.

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

10

28.12.2013, 18:37

Ein Beispiel mittels Kopierkonstruktor:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct SomeData {
    int data;
    SomeData(int d) {
        data = d;
    }
    SomeData(SomeData someData) {
        d = someData.d;
    }
}

int main() {
    SomeData s = new SomeData(5);
    SomeData d = new SomeData(s);
    return 0;
}
Liebe Grüße,
René

Werbeanzeige