2008-11-20 10 views

Respuesta

57

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".

+0

¿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

+6

@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. –

5

Use Nullable<DateTime> si es posible.

4

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; 
220

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 
} 
+4

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. –

+10

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. –

0

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!)

4

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"); 
} 
+1

'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 –

2

yo diría que el valor por defecto es siempre new DateTime(). Así podemos escribir

DateTime datetime; 

if (datetime == new DateTime()) 
{ 
    //unassigned 
} 
+1

Esta solución ya fue dada por + Hath en 2008 y, como + Rupert Rawnsley agregó como comentario, no es a prueba de balas ... –

14

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 
} 
Cuestiones relacionadas