Yanıtlar:
C # 'da bir değer atanmamış bir değişkene sahip olmanın tek yolu, onun yerel bir değişken olmasıdır - bu durumda, derleme zamanında, ondan okumaya çalışarak onun kesinlikle atanmadığını anlayabilirsiniz: )
Gerçekten istediğinizden şüpheleniyorum Nullable<DateTime>(veya DateTime?C # sözdizimsel şekeri ile) - nullile başlamasını sağlayın ve sonra normal bir DateTimedeğer atayın (uygun şekilde dönüştürülecek). Ardından, "gerçek" bir değerin ayarlanıp ayarlanmadığını görmek nulliçin yalnızca karşılaştırabilirsiniz (veya HasValueözelliği kullanabilirsiniz ).
default(DateTime)ile başlamak için tam da bu yol olan bir alan arasındaki farkı söylemiyor . Temelde, etki alanı içindeki bir değeri sevmediğim "normal kullanım için özel ve kullanılamaz" olarak ele almaktır.
öyle mi demek istiyorsun:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
veya Nullable kullanabilirsiniz
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
bunu bir yere koy:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
sonra:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
IsEmptyyönteminiz true değerini döndürecektir, bu muhtemelen istediğiniz şey değildir (çünkü boş değildir - varsayılan değer atanmıştır). Sanırım yönteminizin adı daha uygun olacaktır IsDefaultValue. Gerçekten boş değer atanamayan bir DateTime'a sahip olamayacağınız için IsEmpty.
IsDefaultValuedaha iyi olurdu
Atanmamış bir tarih saati için GetHashCode () 'un her zaman sıfır olduğunu öğrendim. Bunun boş tarih saatini kontrol etmenin iyi bir yolu olup olmadığından emin değilim, çünkü bu davranışın neden görüntülendiğine dair herhangi bir belge bulamıyorum.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCodeçünkü keneler (DateTime iç gösterimi) geri dönüşü 0 da, aşağıdaki şekilde hesaplanır 0 karma koduna eşit: unchecked((int)ticks) ^ (int)(ticks >> 32);. Ayrıca buraya bakın: referenceource.microsoft.com/#mscorlib/system/datetime.cs,836
Nullable<DateTime>Mümkünse kullanın .
Varsayılan değerin her zaman olduğunu söyleyebilirim new DateTime(). Böylece yazabiliriz
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
Genelde, mümkün olduğunda, ayarlanıp ayarlanmadıklarını belirlemek için değer türlerinin varsayılan değerini kullanmayı tercih ederim. Açıkçası bu her zaman mümkün değil, özellikle de tamsayılar için - ancak DateTimes için MinValue'u değiştirilmediğini belirtmek için ayırmanın yeterince adil olduğunu düşünüyorum. Bunun boş değerlere göre avantajı, boş bir referans istisnası alacağınız bir yerin daha az olmasıdır (ve muhtemelen erişmeden önce boş değeri kontrol etmeniz gerekmeyen çok sayıda yer!)
Her kullanışınızda boşluğu kontrol etmek veya bazı mantığa sarmak gibi Boş değer sorunları hakkında endişelenmek istemiyorsanız ve ayrıca ofset zamanı sorunları hakkında endişelenmek istemiyorsanız, o zaman bu sorunu nasıl çözdüm:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Sadece varsayılan değerin zamanın başlangıcından bir gün sonra olup olmadığını kontrol ediyorum. Tıkır tıkır çalışıyor.