Wie kann ich ein DateTime-Objekt in C # klonen?

88

Wie kann ich ein DateTime-Objekt in C # klonen?

Iain
quelle
6
Warum sollten Sie überhaupt ein klonen müssen DateTime, es ist unveränderlich.
Lukazoid

Antworten:

201

DateTime ist ein Werttyp ( struct)

Dies bedeutet, dass Folgendes eine Kopie erstellt:

DateTime toBeClonedDateTime = DateTime.Now;
DateTime cloned = toBeClonedDateTime;

Sie können auch sicher Dinge tun wie:

var dateReference = new DateTime(2018, 7, 29);
for (var h = 0; h < 24; h++) {
  for (var m = 0; m < 60; m++) {
    var myDateTime = dateReference.AddHours(h).AddMinutes(m);
    Console.WriteLine("Now at " + myDateTime.ToShortDateString() + " " + myDateTime.ToShortTimeString());
  }
}

Beachten Sie, wie im letzten Beispiel myDateTimein jedem Zyklus neu deklariert wird. Wenn ich dateReferencevon AddHours()oder betroffen gewesen wäre AddMinutes(), myDateTimewäre ich sehr schnell weggegangen - aber das tut es nicht, weil es so dateReferencebleibt:

Now at 2018-07-29 0:00
Now at 2018-07-29 0:01
Now at 2018-07-29 0:02
Now at 2018-07-29 0:03
Now at 2018-07-29 0:04
Now at 2018-07-29 0:05
Now at 2018-07-29 0:06
Now at 2018-07-29 0:07
Now at 2018-07-29 0:08
Now at 2018-07-29 0:09
...
Now at 2018-07-29 23:55
Now at 2018-07-29 23:56
Now at 2018-07-29 23:57
Now at 2018-07-29 23:58
Now at 2018-07-29 23:59
Pieter van Ginkel
quelle
25
var original = new DateTime(2010, 11, 24);
var clone = original;

DateTimeist ein Werttyp. Wenn Sie ihn also zuweisen, klonen Sie ihn auch. Das heißt, es macht keinen Sinn, es zu klonen, weil es unveränderlich ist; Normalerweise würden Sie etwas nur klonen, wenn Sie die Absicht hätten, eine der Kopien zu ändern.

Greg Beech
quelle
1
+1 Einverstanden. Ich habe das Problem umgangen, indem ich ein neues DateTime-Objekt erstellt und einfach die erforderlichen Teile, die ich klonen wollte, wie (Tag, Monat, Jahr), aus dem ursprünglichen Datum / Uhrzeit-Objekt kopiert und dann die Zeit für das neue Objekt manuell festgelegt habe. .. als Beispiel.
Dal
11

DateTime ist ein Werttyp. Jedes Mal, wenn Sie ihn einer neuen Variablen zuweisen, klonen Sie ihn.

DateTime foo = DateTime.Now;
DateTime clone = foo;
Darin Dimitrov
quelle