¿Hay alguna manera fácil dentro de C# de verificar si una instancia de DateTime tiene un valor asignado o no?Comprobación para ver si se ha asignado un valor a una variable DateTime
Respuesta
La única manera 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 se puede decir que no se asigna definitivamente al intentar leer de él :)
sospecho que realmente quiere Nullable<DateTime>
(o DateTime?
con el azúcar sintáctica # C) - convierten en null
para empezar y luego asignar un DateTime
valor normal (se convertirá en otra forma apropiada). Luego puede comparar con null
(o usar la propiedad HasValue
) para ver si se ha establecido un valor "real".
Use Nullable<DateTime>
si es posible.
DateTime es el tipo de valor, por lo que nunca puede ser nulo. ¿Si piensas DateTime? (Anulables) que puede utilizar:
DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;
qué se refiere de este modo:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
o puede utilizar anulable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
Solo el segundo de estos es a prueba de balas. El primero asume algo sobre el Desinstalar la representación de un DateTime que no está garantizado por el framework. Personalmente, creo que deberían haber agregado un miembro estático Unset para este escenario. –
Para agregar lo que dijo @RupertRawnsley, en realidad debería comparar con el valor predeterminado (DateTime), que es el valor de un DateTime no asignado. Simplemente sucede que es igual a MinValue, pero podría cambiar. –
general prefiero, siempre que sea posible, utilizar el valor por defecto valor 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 modificado es suficiente. El beneficio de esto sobre nulables es que hay un lugar menos donde obtendrá una excepción de referencia nula (¡y probablemente muchos lugares donde no tiene que verificar nulos antes de acceder!)
Acabo de enterarme que GetHashCode() para un datetime no asignado siempre es cero. No estoy seguro de si esta es una buena forma de verificar la fecha y hora nula, porque no encuentro ninguna documentación sobre por qué se muestra este comportamiento.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
'GetHashCode' devuelve 0 porque los ticks (representación interna de DateTime) también son iguales a 0. Código hash calculado de la siguiente manera:' desmarcado ((int) ticks)^(int) (ticks >> 32); '. También vea aquí: http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,836 –
yo diría que el valor por defecto es siempre new DateTime()
. Así podemos escribir
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
Esta solución ya fue dada por + Hath en 2008 y, como + Rupert Rawnsley agregó como comentario, no es a prueba de balas ... –
poner esto en alguna parte:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
a continuación:
DateTime datetime;
if (datetime.IsEmpty())
{
//unassigned
}
- 1. powershell probando una variable que aún no se ha asignado
- 2. Comprobación para ver si existe un valor en Javascript
- 3. Comprobación para ver si se puede liberar un puntero
- 4. C - Compruebe si se ha asignado un número entero
- 5. Comprobación para ver si un elemento DOM tiene foco
- 6. Comprobación de si un convertidor ya se ha registrado
- 7. jQuery comprobación para ver si se muestra Div
- 8. programación comprobar para ver si el calendario se ha prestado
- 9. QTP: comprobación Si una matriz de cadenas contiene un valor
- 10. Comprobando si se ha definido una variable de conveniencia gdb
- 11. ¿Puede un objeto inspeccionar el nombre de la variable a la que ha sido asignado?
- 12. Comprobación para ver si se implementó un método de protocolo opcional
- 13. La consola de JavaScript imprime el valor asignado de la variable antes de que se le haya asignado?
- 14. Comprobación de un valor nulo en Objective-C que se ha devuelto desde una cadena JSON
- 15. ¿Cómo puedo saber si un delegado en particular ya ha sido asignado a un evento?
- 16. ¿Cómo detectar si una variable ha cambiado?
- 17. jquery Comprobación para ver si el elemento tiene el elemento
- 18. ver si un valor de columna se actualiza
- 19. Cómo ver si un subarchivo de un directorio ha cambiado
- 20. Comprobación para ver si existe una columna en un lector de datos
- 21. Comprobación simple para ver si al menos un objeto en un conjunto tiene un valor de propiedad TRUE
- 22. Comprobación de una cadena para ver si el archivo existe localmente
- 23. Comprobación de si un objeto se ajusta a dos protocolos separados en Objective-C
- 24. ¿Qué método de comprobación para ver si un NSDictionary contiene una clave particular es más rápido?
- 25. Las tareas deben aparecer solo si se le ha asignado al usuario
- 26. ¿Cómo se prueba para ver si existe una variable en una estructura de ColdFusion?
- 27. Verificar/Verificar para ver si se ha instalado un Perfil de configuración en el iPhone
- 28. "Agregar un valor a una columna 'datetime' causó un desbordamiento."
- 29. Establecer una variable de DateTime
- 30. C# - comprobando si se inicializa una variable
¿qué hay de comprobar si el valor es igual al valor por defecto de fecha y hora. ¿Hay alguna desventaja imperceptible de este enfoque? if (request.StartDateTime == default (DateTime) {request.StartDateTime = DateTime.Now;} – Menol
@Menol: Bueno, eso no indica la diferencia entre un campo que deliberadamente ha recibido un valor de 'predeterminado (DateTime) 'y uno que era solo de esa manera para comenzar. Básicamente es tratar un valor dentro del dominio como" especial e indisponible para uso normal ", lo cual no me gusta. –