2011-01-27 22 views
13

Estoy diseñando un sitio web C#/NHibernate que cuenta con un sistema de mensajería privado. Me gustaría que los administradores verifiquen si un usuario ha leído un mensaje y cuándo, y juntos resaltan los mensajes que aún no han sido leídos por los usuarios. Para obtener a la vez, me encontré con dos opciones:Mejor DateTime? o use el valor predeterminado (DateTime) para NULL?

Opción 1

class Message 
{ 
    DateTime? Read; 
} 

donde Read==null significa no leído todavía

Opción 2

class Message 
{ 
    DateTime Read; 
} 

donde Read==default(DateTime) (Enero 1º 1 dC, 0 : 00: 00) significa que aún no se ha leído.

En la universidad, me han enseñado a utilizar el valor NULL para manejar todas especiales casos, y también utilizando el anulable tipo parece una buena opción ya que parece más fácil para consultar los mensajes no leídos comprobando si son NULL o no.

Pero, el uso de tipos de nullable al menos implica boxeo y unboxing en el código, con un rendimiento decreciente. Por otro lado, la consulta de los mensajes no leídos significa comparar el valor (pero puede ser indexado)

Mi pregunta es

¿Cuál es su enfoque sugerido para esto? ¿Qué mejores prácticas sugieren en este caso?

Respuesta

17

Utilice DateTime?. Su propósito específico es evitar el uso de valores reservados (también conocidos como "números mágicos") para representar casos especiales, como null.

Además, el uso de un tipo nullable no introduce boxeo. Cualquier valor que haya sido encuadrado será, pero no introducirá ningún boxeo simplemente cambiando. El tipo Nullable<T> es en realidad una estructura, y la capacidad de comparar con null (o Nothing en VB.NET) es estrictamente una convención de lenguaje. Debajo de las portadas, se traduce en un cheque en la propiedad HasValue.

7

El uso de tipos anulables no "disminuye significativamente el rendimiento" en comparación con enfoques alternativos. Ambos DateTime y DateTime? son estructuras y no hay boxeo involucrado aquí. Usar una nullable es la elección correcta.

0

Como dijeron Mark y Adam, un tipo que admite nulo es el camino a seguir. No verá un golpe de rendimiento y hará que las consultas sean mucho más simples.

0

Para aprovechar lo que dijo Mark, si le preocupaba el uso de un tipo anulable en el código del cliente, podría establecerlo en DateTime.MinValue y luego en una capa de negocios, cambiar a un valor nulo. Luego puede alimentar el tipo que admite nulos para su DataAccess. Esto ayuda a mantener una capa de abstarction para usar nulables.

3

Hágase la misma pregunta cuando se trata de valores numéricos. ¿Uso 0? ¿Qué pasa si 0 tiene un significado real? NULL es la ausencia de valor. 99 de cada 100 veces, vaya con lo que hace que la intención del código sea más evidente. En cuanto al rendimiento, incluso si lo hay, palidecerá en comparación con los problemas de rendimiento que tenga su propio código.

0

¿Falta un truco?

class Message 
{ 
    DateTime LastRead; 
    bool Read; 
} 
+3

Este es semánticamente equivalente a usar 'Anulable ', aunque esta versión no será capaz de tomar ventaja de la asignación de la pila (que 'Anulable ' puede, asumiendo las demás condiciones son derecha) y que no encapsula la lógica en un solo miembro. –

+0

@ Adam Robinson, de acuerdo en su mayor parte. No creí que usar un único miembro fuera un requisito previo de la pregunta (aunque supongo que está implícito), y al no encapsular dos piezas de información en un campo, hace que la estructura sea más fácil de admitir, especialmente si ' El desarrollador que hereda el código :) No sigo el punto de asignación de la pila, ¿pueden ampliarlo? – Brett

+0

No era un requisito previo, pero es más fácil realizar operaciones CRUD sin errores en un miembro en lugar de dos. Y no sabía acerca de la asignación de la pila: el punto es que pensé que los valores anulables se asignaron en montón. Y, de todos modos, mi pregunta se centró en las mejores prácticas –

Cuestiones relacionadas