ฉันจะโคลนวัตถุ DateTime ใน C # ได้อย่างไร


คำตอบ:


205

DateTime เป็นประเภทค่า ( struct)

ซึ่งหมายความว่าสิ่งต่อไปนี้จะสร้างสำเนา:

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

คุณยังสามารถทำสิ่งต่างๆได้อย่างปลอดภัยเช่น:

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

สังเกตว่าในตัวอย่างสุดท้ายmyDateTimeได้รับการประกาศใหม่ในแต่ละรอบอย่างไร ถ้าdateReferenceมีรับผลกระทบจากAddHours()หรือAddMinutes(), myDateTimeจะได้เดินออกไปอย่างรวดเร็วจริงๆ - แต่มันไม่ได้เพราะdateReferenceการเข้าพักใส่:

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

26
var original = new DateTime(2010, 11, 24);
var clone = original;

DateTimeเป็นประเภทค่าดังนั้นเมื่อคุณกำหนดคุณจะต้องโคลนด้วย ที่กล่าวว่าไม่มีประเด็นในการโคลนเพราะมันไม่เปลี่ยนรูป โดยทั่วไปคุณจะโคลนบางอย่างก็ต่อเมื่อคุณมีความตั้งใจที่จะเปลี่ยนสำเนาอย่างใดอย่างหนึ่ง


1
+1 เห็นด้วย วิธีที่ฉันแก้ไขปัญหาคือสร้างวัตถุ DateTime ใหม่และเพียงแค่คัดลอกส่วนที่ต้องการที่ฉันต้องการโคลนเช่น (วันเดือนปี) จากวัตถุวันที่และเวลาเดิมจากนั้นตั้งเวลาด้วยตนเองสำหรับวัตถุใหม่ .. .. ตัวอย่างเช่น.
Dal

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.