¿Hay alguna manera fácil dentro de C # para verificar si una instancia de DateTime ha recibido un valor o no?
131
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".
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.quieres decir así:
o podrías usar Nullable
fuente
pon esto en alguna parte:
luego:
fuente
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 comoIsDefaultValue
. Dado que realmente no puede tener un DateTime no anulable esoIsEmpty
.IsDefaultValue
hubiera sido mejorDateTime es un tipo de valor, por lo que nunca puede ser nulo. Si piensas DateTime? (Anulable) puede usar:
fuente
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.
fuente
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.fuente
Yo diría que el valor predeterminado es siempre
new DateTime()
. Para que podamos escribirfuente
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!)
fuente
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:
Solo verifico que el valor predeterminado es menos de un día después del comienzo del tiempo. Funciona de maravilla.
fuente