2013-04-29 35 views
39

Tôi cần kiểm tra giá trị DateTime nếu giá trị đó có giá trị hay không.Cách kiểm tra giá trị DateTime mặc định?

Tôi có một vài lựa chọn:

if (dateTime == default(DateTime)) 

hoặc

if (dateTime == DateTime.MinValue) 

hoặc sử dụng một nullable DateTime?

if (nullableDateTime.HasValue) 

Cá nhân tôi muốn phiên bản thứ ba, vì có thể đọc được khá tốt của nó. Nhưng trong cơ sở dữ liệu của chúng tôi, chúng tôi có một số cột datetime được định nghĩa là không rỗng. Vì vậy, trong một số trường hợp, tôi phải đi với hai tùy chọn đầu tiên.

Tôi đọc ở đâu đó rằng từ khóa default nên được sử dụng khi làm việc với generics, nhưng không phải là nó dễ đọc hơn nhiều trong trường hợp này? Khi sử dụng tùy chọn thứ hai, tôi phải biết rằng giá trị mặc định của một thể hiện DateTime mới và trống là DateTime.MinValue có mùi của một chi tiết thực hiện cho tôi.

Tôi nên sử dụng tùy chọn nào để sử dụng "thực hành tốt nhất"?

+0

Trong câu đầu tiên của bạn sau khi các khối mã, bạn có nghĩa là "phiên bản thứ hai", hoặc bạn có nghĩa là "phiên bản thứ ba"? –

+0

Đã cập nhật nó;) Tôi có nghĩa là phiên bản thứ ba, vì tài sản giải thích rõ ràng những gì tôi định kiểm tra: nếu biến có giá trị – dasheddot

+0

Và điều gì sẽ xảy ra khi bất kỳ điều gì thực sự xảy ra vào ngày đó? – Servy

Trả lời

42

tôi có lẽ sẽ làm cho điều này thực sự rõ ràng:

// Or private, or maybe even public 
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns 
    = DateTime.MinValue; 

Được rồi, vì vậy tôi muốn làm cho tên hơi ít dài dòng, nhưng bạn sẽ có được những gì tôi có ý nghĩa. Nó không thực sự quan trọng nhiều như thế nào bạn khởi tạo giá trị đó - đó là rõ ràng những gì bạn đang cố gắng để làm.

(Tất nhiên, sử dụng một loại nullable bất cứ lúc nào bạn có thể cho việc này. Tôi giả định các câu hỏi được hỏi bởi vì bạn không thể làm như vậy trong những tình huống nhất định.)

+0

Đối với bối cảnh MY (không thể điều chỉnh cơ sở dữ liệu để hỗ trợ các cột datetime rỗng) Tôi không may cần phải đi mà không có Nullable. Vì vậy, đề nghị của bạn là chấp nhận được nhất, gây ra bằng cách làm cho điều này rõ ràng quy tắc kinh doanh đằng sau kiểm tra có thể được thực hiện dễ dàng hơn. Tôi sẽ đi theo cách này. Chấp nhận nó, cảm ơn! – dasheddot

+2

@dasheddot: Tôi cũng sẽ đặt logic này vào lớp dữ liệu của bạn và chuyển đổi thành Nullable khi thích hợp để mã của bạn ở mọi nơi khác sẽ sử dụng mã đẹp và bạn chỉ phải sử dụng kiểm tra ở trên một lần. – Chris

14

tôi cần phải kiểm tra giá trị DateTime nếu giá trị đó có giá trị hay không.

Bạn đã mô tả khá nhiều tình huống sách giáo khoa yêu cầu Nullable<DateTime>. Tôi sẽ đi với tùy chọn đó.

(Bạn rõ ràng sẽ cần một số loại lớp dịch thuật nếu bạn cần lưu các giá trị vào cột db không trống, nhưng tôi cố giữ giá trị "ma thuật" gần db nhất có thể, và cố gắng giữ mã C# của bạn sạch sẽ và thành ngữ.)

4

Thực tiễn "tốt nhất" sẽ sử dụng giá trị rỗng DateTime. Các loại giá trị không hợp lệ được tạo ra chính xác vì lý do đó mà không tin cậy các số "ma thuật".

Điều quan trọng nhất về cách tiếp cận này là ý định của nó - nó là gì có nghĩa là trong ngữ cảnh của bạn để có ngày/giờ "mặc định"?

+0

Trong ngữ cảnh của tôi nó thực sự có nghĩa là không có ngày nào được xác định bởi người dùng có giá trị từ cảnh quy tắc nghiệp vụ. Vì vậy, tôi đoán Nullable sẽ là tốt nhất, nhưng tiếc là tôi không thể thích nghi với cơ sở dữ liệu, cho phép tôi dính vào hai phiên bản đầu tiên. – dasheddot

0

Có thể bạn có thể đặt giá trị mặc định trong cơ sở dữ liệu bằng getdate() và sau đó cập nhật tất cả giá trị null thành giá trị tối thiểu hoặc bất kỳ thứ gì bạn muốn. Ít nhất bạn sẽ có một điều kiện

Các vấn đề liên quan