DateTime mới () so với mặc định (DateTime)


196

Có một lý do để chọn một trong những cái này hơn cái kia?

DateTime myDate = new DateTime();

hoặc là

DateTime myDate = default(DateTime);

Cả hai đều bằng nhau 1/1/0001 12:00:00 AM.


28
Điều này tương đương với DateTime.MinValue, vì vậy bạn cũng có thể làm DateTime myDate = DateTime.MinValuenhư vậy: /
Lloyd

20
@Lloyd Hầu hết thời gian ... nhưng không phải là tham số mặc định DateTime.MinValue không phải là hằng số thời gian biên dịch - mà là mặc định (DateTime) / DateTime () mới.
Ricibob

12
Chỉ cần làm rõ nhận xét xuất sắc của @ Ricibob, bởi vì điều đó rất quan trọng: nếu bạn đang tạo một phương thức với một tham số tùy chọn, bạn CHỈ có thể sử dụng một trong hai default(DateTime)hoặc new DateTime(). Đó là cả hai hằng số thời gian biên dịch , được yêu cầu cho các giá trị tham số tùy chọn. Nếu hằng số thời gian biên dịch không bắt buộc, sau đó default(DateTime), new DateTime()DateTime.MinValueđược hoán đổi.
leanne

Câu trả lời:


200

Không, chúng giống hệt nhau.

default(), đối với mọi loại giá trị ( DateTimelà loại giá trị) sẽ luôn gọi hàm tạo không tham số.


29
FWIW; Trong C # 6 hành vi này sẽ thay đổi. C # 6 giới thiệu các hàm tạo không tham số cho các cấu trúc, cho phép hành vi newkhác với những gì default(T)sẽ làm.
vcsjones 27/2/2015

30
Người ta có thể lập luận rằng default(DateTime)mô tả nhiều hơn về ý định của lập trình viên, do đó thường thuận lợi hơn.
intrepidis

16
@vcsjones điều này đã bị xóa trước khi phát hành C # 6.0 cuối cùng.
nawfal

5
@nawfal Vâng. Có lẽ tốt nhất là nó đã làm, quá.
vcsjones

Câu trả lời này chỉ sai IMO: hai điều giống nhau về mặt ngữ nghĩa, nhưng cả hai đều không gọi hàm tạo - cả hai tùy chọn cú pháp đều sử dụnginitobj
Marc Gravell

22

Nếu bạn muốn sử dụng giá trị mặc định cho tham số DateTime trong một phương thức, bạn chỉ có thể sử dụng mặc định (DateTime).

Dòng sau sẽ không biên dịch:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Dòng này sẽ biên dịch:

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

3
Tất nhiên DateTime.MinValue không biên dịch? Các tham số tùy chọn phải là hằng số thời gian biên dịch, mà MinValue thì không. mặc định (DateTime) và DateTime mới () đều mặc dù có giá trị (mà thực sự là buồn cười, vì const DateTime x = mặc định (DateTime) là không hợp lệ, vì DateTime giá trị không thể được khai báo là hằng số thời gian biên dịch).
Jerri Kangasniemi

16

Câu trả lời là không. Hãy nhớ rằng trong cả hai trường hợp , mdDate.Kind = DateTimeKind.Unspecified.

Vì vậy, có thể tốt hơn để làm như sau:

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

Các myDate.Kindbất động sản là chỉ đọc, vì vậy nó không thể thay đổi sau khi các nhà xây dựng được gọi.


2
Làm thế nào mà trả lời câu hỏi của OP?
Mo Patel

46
Xin vui lòng xem 4 từ đầu tiên của câu trả lời của tôi.
Ben C

4
Tôi sẽ tranh luận chống lại điều này. Mặc định DateTimelà hữu ích như một giá trị không được đặt giá trị, với một so sánh đơn giản với default(DateTime). Những gì sử dụng là một 01/01/0001giá trị không mặc định ?
Rawling

Hãy nhớ rằng đó là DateTimeKind.Utc thay vì DateTimeKind.UTC
Roberto

@Roberto Cảm ơn, đã sửa.
jpaugh

-3

Cách đơn giản nhất để hiểu nó là DateTime là một cấu trúc. Khi bạn khởi tạo một cấu trúc, nó sẽ khởi tạo giá trị tối thiểu của nó:DateTime.Min

Do đó không có sự khác biệt giữa default(DateTime)new DateTime()DateTime.Min


3
Không, cấu trúc không nhất thiết phải được khởi tạo với giá trị tối thiểu của chúng. Chúng được khởi tạo cho tất cả các bit bằng không. Đối với một số loại, đó là giá trị thấp nhất của chúng, đối với các loại khác, chẳng hạn như các loại số có thể âm, không có giá trị gần với giá trị tối thiểu của chúng. Và tất nhiên, những người khác vẫn sẽ không thể so sánh và sẽ không giá trị "tối thiểu".
Phục vụ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.