¿Hay alguna manera fácil dentro de C # para verificar si una instancia de DateTime ha recibido un valor o no?
La única forma de tener una variable a la que no se le ha asignado un valor en C # es que sea una variable local, en cuyo caso, en tiempo de compilación, puede decir que definitivamente no está asignada al intentar leer de ella: )
Sospecho que realmente quieres Nullable<DateTime>
(o DateTime?
con el azúcar sintáctico C #): haz que null
comience y luego asigna un DateTime
valor normal (que se convertirá adecuadamente). Luego, puede comparar con null
(o usar la HasValue
propiedad) para ver si se ha establecido un valor "real".
quieres decir así:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
o podrías usar Nullable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
pon esto en alguna parte:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
luego:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
IsEmpty
método devolverá true, lo que probablemente no es lo que se quiere (porque es no vacío - que ha sido asignado el valor por defecto). Supongo que el nombre de su método sería más adecuado como IsDefaultValue
. Dado que realmente no puede tener un DateTime no anulable eso IsEmpty
.
IsDefaultValue
hubiera sido mejor
DateTime es un tipo de valor, por lo que nunca puede ser nulo. Si piensas DateTime? (Anulable) puede usar:
DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;
Me acabo de enterar de que GetHashCode () para una fecha y hora no asignada siempre es cero. No estoy seguro de si esta es una buena manera de verificar la fecha y hora nulas, porque no puedo encontrar ninguna documentación sobre por qué se muestra este comportamiento.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCode
devuelve 0 a causa de garrapatas (representación interna de DateTime) son también igual a 0. código Hash calculado por la manera siguiente: unchecked((int)ticks) ^ (int)(ticks >> 32);
. Ver también aquí: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
Úselo Nullable<DateTime>
si es posible.
Yo diría que el valor predeterminado es siempre new DateTime()
. Para que podamos escribir
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
Generalmente prefiero, cuando sea posible, usar el valor predeterminado de los tipos de valor para determinar si se han establecido. Obviamente, esto no es posible todo el tiempo, especialmente con ints, pero para DateTimes, creo que reservar el MinValue para indicar que no se ha cambiado es lo suficientemente justo. El beneficio de esto sobre los valores nulables es que hay un lugar menos donde obtendrás una excepción de referencia nula (¡y probablemente muchos lugares donde no tienes que verificar si es nulo antes de acceder a él!)
Si no desea tener que preocuparse por los problemas de valor nulo, como verificar si es nulo cada vez que lo usa o resumirlo en alguna lógica, y tampoco desea preocuparse por los problemas de tiempo de compensación, entonces esto es Cómo resolví el problema:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Solo verifico que el valor predeterminado es menos de un día después del comienzo del tiempo. Funciona de maravilla.
default(DateTime)
y uno que era solo esa forma de comenzar. Básicamente se trata de un valor dentro del dominio como "especial y no disponible para uso normal" que no me gusta.