C# DateTime-immer neues Objekt anlegen?
warum in C# meine zwei Punkte Variablen zu anderen DateTime-Objekten?
DateTime a1 = DateTime.Now;
DateTime a2 = a1;
a1 = a1 + TimeSpan.FromMinutes(15);
a2 = a2 - TimeSpan.FromMinutes(16);
Erkannte ich, dass der a2 eigentlich Punkte, um ein neues Objekt Verschieden von a1.
Aber Im anderen Fall. Sagen wir ich habe eine Klasse Person und Alter = 1;
Person a1 = new Person();
a2 = a1;
a2 = Person.Age = 2;
In der Person Fall, a1 und a2 zeigen auf dasselbe Objekt. Ich bin wirklich verwirrt hier, wer kann das erklären?
- DateTime ist ein Werttyp , der nicht einen Verweis geben
- Überprüfen Sie diese Antwort stackoverflow.com/a/4265417/1511796
Du musst angemeldet sein, um einen Kommentar abzugeben.
DateTime
ist ein Wert-Typ - Struktur.Mit Wert-Typen, wenn Sie etwas tun, wie:
a2
bekommt eine kopieren der Werte vona1
. Es ist nicht die gleiche Referenz auf die gleiche Speicherposition, aber eine vollständige, unabhängige Kopie.Auf der anderen Seite
Person
ist ein Referenz-Typ - a-Klasse.Wenn du dies tust:
Mit einem Typ der Referenz, die Bezugnahme, die
p2
Punkte zu, ist der gleiche, diep1
Punkte zu. So änderungen sind änderungen an beide.Sehen Werttypen und Verweistypen auf der MSDN-Website.
string
wurde als unveränderlich aus vielen verschiedenen Gründen (Optimierung ist eine). Können Sie erstellen, die unveränderlich Wert-oder Referenztypen sind.Als andere haben bereits darauf hingewiesen
DateTime
ist eine Struktur, nicht eine Klasse und damit ein Wert-Typ. Visualisieren Sie diese in der Visual Studio-editor, wenn Sie den text ändern der Farbe verwendet, um display-Strukturen. Öffnen Sie den dialog im MenüTools
>Options
" und navigieren Sie zuEnvironment
>Fonts and Colors
Ist es hilfreich, ändern Sie die Farbe der Delegierten, enums, interfaces und Strukturen (Wertetypen).
Der Unterschied hier ist, dass DateTime einen Wert geben, und ich gehe davon aus, daß die Person ein Referenz-Typ (Klasse).
Im Fall einer Variablen Zuordnung eines Wert-Typ sind Sie eigentlich kopieren Sie den Inhalt des Speichers von einem Speicherort zu einem anderen.
Jedoch, im Falle eines Referenz-Typ, du bist immer noch, zeigen auf den gleichen Speicherbereich.
Gibt es zwei verschiedene Konzepte, die hier am Werk. Die erste ist, dass
DateTime
ist ein Wert-Typ (eine.k.ein. ein struct), währendPerson
ist [vermutlich] ein Referenz-Typ (eine Klasse). Weil dieses, wenn Sie tun:date2
führen wird, kopieren den Wert, so dass die zwei Variablen wird keine Referenz auf das gleiche Objekt.Mit Klassen, wenn Sie das tun:
p1
tatsächlich nicht enthaltenPerson
es gibt nur eine Bezug zu einer person. Diese Bezugnahme ist dann kopiert (nach Wert) zup2
. Die Wirkung des Kopierens, dass die Referenz ist, dass beide Variablen sind nun "zeigen" oder "verweisen auf" das gleiche Objekt.Als Nächstes gibt es die Frage der Veränderbarkeit.
Person
in diesem Fall ist eine veränderliche Art. Das bedeutet, dass es geändert werden kann. Ein immutble Typ auf der anderen Seite können nicht geändert werden einmal gebaut.Die Zeile:
tatsächlich ändert das Objekt, das
p2
Referenzen, und seitp2
undp1
beide das gleiche Objekt referenzieren,p1.Age
wäre2
nach dieser Zeile code.Nun, zu Demonstrationszwecken, wir machen eine unveränderliche
Person
Klasse:Wenn wir so etwas tun:
in der zweiten Zeile macht genau das, was es vorher war, so dass beide auf das gleiche Objekt zeigen, aber die Dritte Zeile ist anders. Statt Sie direkt zu verändern (oder mutiert), dass die person zu machen, ein Jahr älter, unsere
Grow
Methode gibt ein neuesPerson
Objekt das stellt jemand ein Jahr älter. Nach diesemp2
undp1
wird nicht mehr auf ein Objekt verweisen; ich habe nur geändert, was für ein Objektp2
Hinweise auf ein neues eine, dieGrow
Methode gerade erstellt haben.Dieses zweite Beispiel ist eher ähnlich zu dem, was ist Los mit
DateTime
. Sie können nicht mutieren einemDateTime
Objekt; es ist unveränderlich. Der Aufruf der Methoden (in diesem Fall die plus-und minus-Operatoren) gibt und ganz neues Objekt. Durch Konvention, Wert-Typen sollten nicht verändert werden ohne eine zwingenden Grund, wie kann es oft schwierig sein, mit Ihnen umzugehen. Referenz-Typen können entweder unveränderlich oder veränderlich; weder hat erhebliche Probleme (im Allgemeinen Fall).