Câu trả lời:
Cách duy nhất để có một biến chưa được gán giá trị trong C # là biến đó là biến cục bộ - trong trường hợp đó tại thời điểm biên dịch, bạn có thể nói rằng nó không được gán chắc chắn bằng cách cố gắng đọc từ nó: )
Tôi nghi ngờ bạn thực sự muốn Nullable<DateTime>
(hoặc DateTime?
với đường cú pháp C #) - làm cho nó null
bắt đầu bằng và sau đó gán một DateTime
giá trị bình thường (sẽ được chuyển đổi một cách thích hợp). Sau đó, bạn có thể chỉ cần so sánh với null
(hoặc sử dụng thuộc HasValue
tính) để xem liệu giá trị "thực" đã được đặt chưa.
default(DateTime)
và một lĩnh vực chỉ là cách đó để bắt đầu. Về cơ bản, nó coi một giá trị trong miền là "đặc biệt và không có sẵn cho sử dụng bình thường" mà tôi không thích.
bạn có nghĩa là như vậy:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
hoặc bạn có thể sử dụng Nullable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
đặt cái này ở đâu đó:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
sau đó:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
IsEmpty
phương thức của bạn sẽ trả về đúng, đó có thể không phải là điều bạn muốn (vì nó không trống - nó được gán giá trị mặc định). Tôi đoán tên phương pháp của bạn sẽ phù hợp hơn như IsDefaultValue
. Vì bạn thực sự không thể có một DateTime không thể rỗng mà IsEmpty
.
IsDefaultValue
sẽ tốt hơn
Tôi vừa phát hiện ra rằng GetHashCode () cho một datetime chưa được gán luôn luôn bằng không. Tôi không chắc đây có phải là một cách tốt để kiểm tra null datetime không, bởi vì, tôi không thể tìm thấy bất kỳ tài liệu nào về lý do tại sao hành vi này được hiển thị.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCode
trả về 0 vì dấu tích (biểu diễn bên trong của DateTime) cũng bằng 0. Mã băm được tính theo cách sau : unchecked((int)ticks) ^ (int)(ticks >> 32);
. Xem thêm ở đây: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
Tôi muốn nói giá trị mặc định là luôn luôn new DateTime()
. Vì vậy chúng tôi có thể viết
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
Tôi thường thích, nếu có thể, sử dụng giá trị mặc định của các loại giá trị để xác định xem chúng đã được đặt chưa. Điều này rõ ràng là không thể mọi lúc, đặc biệt là với các số nguyên - nhưng đối với DateTimes, tôi nghĩ rằng việc đặt MinValue để biểu thị rằng nó đã không được thay đổi là đủ công bằng. Lợi ích của việc này là vô giá trị là có một nơi ít hơn nơi bạn sẽ có ngoại lệ tham chiếu null (và có thể rất nhiều nơi bạn không phải kiểm tra null trước khi truy cập!)
Nếu bạn không muốn phải lo lắng về các vấn đề giá trị Null như kiểm tra null mỗi khi bạn sử dụng hoặc gói nó trong một số logic và bạn cũng không muốn phải lo lắng về vấn đề thời gian bù, thì đây là Làm thế nào tôi giải quyết vấn đề:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Tôi chỉ kiểm tra xem giá trị mặc định là ít hơn một ngày sau khi bắt đầu thời gian. Hoạt động như một lá bùa.