Ich bekomme immer wieder das gleiche Problem, wo ein Objekt, das ich verweisen möchte, kopiert wird oder wo ein Objekt, das ich kopieren möchte, verwiesen wird. Dies passiert, wenn ich den Operator = verwende.Wann wird ein C# -Wert/Objekt kopiert und wann wird seine Referenz kopiert?
Zum Beispiel, wenn ich das Objekt in einer anderen Form sende, das heißt:
SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;
... und ändern Sie dann das Objekt in der Form, wird das ursprüngliche Objekt nicht geändert bekommen. Es ist, als ob das Objekt kopiert und nicht referenziert wurde. Doch wenn ich dies tun:
SomeObject myObject = new SomeObject();
SomeObject anotherObject = new SomeObject();
anotherObject = myObject;
... und dann ändern anotherObject
, myObject
ebenfalls geändert wird.
Der erschwerende Fall ist, wenn ich versuche, eine meiner definierten Objekte zu klonen:
diesespublic class SomeObject
{
double value1, value2;
//default constructor here
public SomeObject(val1, val2)
{
value1 = val1;
value2 = val2;
}
public void Clone(SomeObject thingToCopy)
{
this.value1 = thingToCopy.value1;
this.value2 = thingToCopy.value2;
}
}
wenn ich ...
SomeObject obj1 = new SomeObject(1, 2);
SomeObject obj2 = new SomeObject();
obj2.Clone(obj1);
... obj1
verwiesen wird, und alle Änderungen zu obj2
Änderungen obj1
.
Systemobjekte wie int, double, string
usw. scheinen immer kopiert zu werden, außer im Falle der obigen Klonmethode.
Meine Frage ist, nicht die Verwendung des Schlüsselwortes ref
in Funktionen zu berücksichtigen, wann ein Objekt kopiert wird und wann ein Objekt in jedem Fall referenziert wird (dh bei der Übergabe an Funktionen, beim Setzen als andere Objekte (wie die ersten beiden obigen Beispiele), beim Kopieren von Elementvariablen wie das dritte Beispiel usw.)?
Ich werde einen schreiben müssen . Ich verstehe Zeiger größtenteils aus C++, ich verstehe nur nicht, wenn sie in Bezug auf Werte und Referenztypen in C# verwendet werden, da es keine explizite "sichere" Zeigerverwendung/Operatoren in C# gibt. –
Ich werde das Programm später schreiben als jetzt bin ich bei der Arbeit. Danke für die Hilfe. Ich werde die Artikel auch lesen. –
Die Analogie der Adresse auf separaten Zetteln ist hilfreich, um das Konzept der Referenztypen zu verstehen. – Martin