ใหม่ DateTime () เทียบกับค่าเริ่มต้น (DateTime)


196

มีเหตุผลที่จะเลือกอย่างใดอย่างหนึ่งเหล่านี้มากกว่าที่อื่น ๆ ?

DateTime myDate = new DateTime();

หรือ

DateTime myDate = default(DateTime);

1/1/0001 12:00:00 AMทั้งสองคนมีความเท่าเทียมกัน


28
ซึ่งเท่ากับDateTime.MinValueคุณสามารถทำได้DateTime myDate = DateTime.MinValueเช่นกัน: /
Lloyd

20
@Lloyd ส่วนใหญ่เวลา ... แต่ไม่เป็นพารามิเตอร์เริ่มต้น DateTime.MinValue ไม่ใช่ค่าคงที่เวลารวบรวม - แต่ค่าเริ่มต้น (DateTime) / DateTime ใหม่ () คือ
Ricibob

12
เพียงชี้แจงความคิดเห็นที่ยอดเยี่ยมของ @ Ricibob เพราะเป็นสิ่งสำคัญ: หากคุณกำลังสร้างวิธีด้วยพารามิเตอร์ที่เป็นตัวเลือกคุณสามารถใช้อย่างใดอย่างหนึ่งdefault(DateTime)หรือnew DateTime()เท่านั้น สิ่งเหล่านี้เป็นค่าคงที่เวลาการคอมไพล์ซึ่งจำเป็นสำหรับค่าพารามิเตอร์ทางเลือก หากค่าคงที่รวบรวมเวลาไม่จำเป็นแล้วdefault(DateTime), new DateTime()และDateTime.MinValueสามารถใช้แทนกัน
ลีแอนน์

คำตอบ:


200

ไม่พวกเขาเหมือนกัน

default()สำหรับชนิดของค่าใด ๆ ( DateTimeเป็นประเภทค่า) จะเรียกตัวสร้างพารามิเตอร์แบบไม่มีพารามิเตอร์เสมอ


29
FWIW; ใน C # 6 พฤติกรรมนี้จะเปลี่ยนไป C # 6 แนะนำตัวสร้างแบบไร้พารามิเตอร์สำหรับ structs ซึ่งอนุญาตให้พฤติกรรมnewแตกต่างจากสิ่งที่default(T)จะทำ
vcsjones

30
ใคร ๆ ก็เถียงว่าdefault(DateTime)มีความหมายของเจตนาของโปรแกรมเมอร์มากกว่า
intrepidis

16
@vcsjones สิ่งนี้ถูกลบออกก่อนที่จะปล่อย C # 6.0 ครั้งสุดท้าย
nawfal

5
@nawfal ใช่ อาจดีที่สุดที่มันทำเช่นกัน
vcsjones

คำตอบนี้ผิด IMO: สองสิ่งนี้มีความหมายเหมือนกัน แต่ทั้งคู่ไม่ได้เรียกนวกรรมิก - ทั้งสองทางเลือกใช้ไวยากรณ์initobj
Marc Gravell

22

หากคุณต้องการใช้ค่าเริ่มต้นสำหรับพารามิเตอร์ DateTime ในวิธีการหนึ่งคุณสามารถใช้ค่าเริ่มต้น (DateTime) เท่านั้น

บรรทัดต่อไปนี้จะไม่รวบรวม:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

บรรทัดนี้จะรวบรวม:

    private void MyMethod(DateTime syncedTime = default(DateTime))

3
แน่นอน DateTime.MinValue ไม่ได้รวบรวม? พารามิเตอร์ทางเลือกต้องเป็นค่าคงที่เวลาคอมไพล์ซึ่ง MinValue ไม่ใช่ default (DateTime) และ DateTime ใหม่ () นั้นใช้ได้ทั้งคู่ (ซึ่งเป็นเรื่องตลกจริง ๆ เนื่องจาก const DateTime x x = default (DateTime) ไม่ถูกต้องเนื่องจากค่า DateTime ไม่สามารถประกาศเป็นค่าคงที่เวลาคอมไพล์ได้)
Jerri Kangasniemi

16

คำตอบคือไม่ โปรดทราบว่าในทั้งสองกรณีmdDate.Kind = DateTimeKind.Unspecifiedเก็บไว้ในใจว่าในทั้งสองกรณี

ดังนั้นจึงเป็นการดีกว่าถ้าจะทำสิ่งต่อไปนี้:

DateTime myDate = new DateTime(1, 1, 1, 0, 0, 0, DateTimeKind.Utc);

myDate.Kindทรัพย์สินอ่านได้อย่างเดียวดังนั้นจึงไม่สามารถเปลี่ยนแปลงได้หลังจากคอนสตรัคที่เรียกว่า


2
นั่นตอบคำถามของ OP อย่างไร
Mo Patel

46
โปรดดูคำตอบ 4 คำแรกของฉัน
Ben C

4
ฉันจะเถียงกับเรื่องนี้ เริ่มต้นDateTimeจะเป็นประโยชน์ AA default(DateTime)มูลค่ามูลค่าไม่ได้ชุดที่มีการเปรียบเทียบง่ายๆในการ สิ่งที่ใช้เป็นค่าที่ไม่ใช่ค่าเริ่มต้น01/01/0001?
Rawling

โปรดจำไว้ว่ามันเป็น DateTimeKind.Utc แทน DateTimeKind.UTC
Roberto

@ Roberto ขอบคุณคงที่
jpaugh

-3

วิธีที่ง่ายที่สุดในการทำความเข้าใจคือ DateTime นั้นเป็นโครงสร้าง เมื่อคุณเริ่มต้นโครงสร้างมันเริ่มต้นมันเป็นค่าขั้นต่ำ:DateTime.Min

ดังนั้นจึงไม่มีความแตกต่างระหว่างdefault(DateTime)และnew DateTime()กับDateTime.Min


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