Bagaimana saya bisa mengkloning objek DateTime di C #?

89

Bagaimana saya bisa mengkloning objek DateTime di C #?

Iain
sumber
6
Mengapa Anda bahkan perlu mengkloning DateTime, itu tidak bisa diubah.
Lukazoid

Jawaban:

203

DateTime adalah tipe nilai (struct )

Ini berarti bahwa berikut ini membuat salinan:

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

Anda juga dapat melakukan hal-hal seperti:

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());
  }
}

Perhatikan bagaimana contoh terakhir myDateTimedideklarasikan lagi di setiap siklus; jika dateReferencetelah terpengaruh oleh AddHours()atau AddMinutes(), myDateTimeakan mengembara dengan sangat cepat - tetapi tidak, karena dateReferencetetap diam:

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
sumber
26
var original = new DateTime(2010, 11, 24);
var clone = original;

DateTimeadalah tipe nilai, jadi saat Anda menetapkannya, Anda juga akan mengkloningnya. Meskipun demikian, tidak ada gunanya mengkloningnya karena tidak dapat diubah; biasanya Anda hanya akan mengkloning sesuatu jika Anda berniat mengubah salah satu salinannya.

Greg Beech
sumber
1
+1 Setuju. Cara saya mengatasi masalah ini adalah dengan membuat objek DateTime baru dan hanya menyalin bagian yang diperlukan yang ingin saya klon seperti (hari, bulan, tahun) dari objek datetime asli dan kemudian mengatur waktu secara manual untuk objek baru .. .. sebagai contoh.
Dal
12

DateTime adalah tipe nilai jadi setiap kali Anda menetapkannya ke variabel baru, Anda kloning.

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