2009-04-03 10 views
7

Siempre me confunden las diferentes formas de expresar nulos. Existe el tipo de referencia nulo (también conocido como "nulo"). Luego, he visto que a lo largo de mi aplicación, los desarrolladores han usado MinValue para representar valores nulos. Ejemplo: Double.MinValue o DateTime.MinValue a excepción de una cadena para la cual utilizan "nulo"Confusión con NULL en C#

Luego está System.DBNull (y System.DBNull.Value - no estoy seguro de qué usar cuando). Para agregar confusión, también hay espacios de nombres System.Nullable y System.Nullable<T>.

¿Alguien me puede ayudar a despejar esta confusión nula?

Gracias

Respuesta

27

seguro.

System.DBNull es una clase que fue (y sigue siendo) utilizada por ADO.NET para representar un valor null en una base de datos.

null es en realidad una referencia null, y en el código de aplicación ningún tipo de referencia se debe utilizar como su null, así, null valor.

El uso de MinValue para varios tipos primitivos (que, dado que son tipos de valores no pueden asignarse null) se remonta a los días oscuros anteriores a C# 2.0, que introdujo los genéricos. Ahora, el método preferido para representar un tipo primitivo que admite nulos es usar el tipo genérico Nullable<T>, generalmente representado en forma abreviada con un signo de interrogación después del tipo primitivo. Por ejemplo, podría declarar una variable de int anulable llamado foo en C# como:

Nullable<int> foo; 

o

int? foo; 

Ambos son idénticos.

+0

¡Gracias por el formateo! ;) –

+0

muy bien hecho - claro e informativo – annakata

0

"MinValue" se usaron con tipos de valores antes de que los tipos anulables aparecieran en C# 2.0. Entonces, hay un montón de código heredado que usa el viejo estilo de saber cuando un tipo de valor no tiene un valor. Hoy en día es mucho más fácil usar un DateTime? date = null que DateTime date = DateTime.MinValue. En lo que respecta a DBNull, eso es algo que se requiere como una capa de abstracción para las bases de datos, pero puede evitar tener que lidiar con ello usted mismo mediante el empleo de un ORM como NHibernate o algo así, prácticamente desde una aplicación. el punto de vista del desarrollo solo tendrá que tratar con los tipos de C# incorporados.

0

MinValue no es nulo. Es MinValue. A veces se usa "como nulo" por personas que usan C# 1.0, que no tiene tipos de valores que aceptan valores numéricos. En su lugar, deberían usar Nullable, ot DateTime ?.

DBNull es un valor .NET que se utiliza para comunicarse con una base de datos ("DB" nulo). El concepto de base de datos de NULL significa algo diferente de la referencia null de .NET. En términos de la base de datos, NULL significa "desconocido" o "ausente".

+0

DBNull en términos de base de datos significa lo mismo que nulo en términos de C#, es solo que cuando .Net 1.x salió no había ningún tipo anulable disponible, ya que los genéricos se introdujeron en la versión 2. – Tracker1

+0

Lo siento, ese no es el caso. NULL en una base de datos relacional significa "desconocido" o "sin información". Piense en una unión OUTER sin una fila coincidente en la segunda tabla: las columnas de esa tabla se devolverán como NULL, lo que significa que no están presentes. –

1
  • nulo para los tipos de referencia en el valor nula real
  • Anulable, añadido en .NET 2.0 es una manera de expresar nulos para el valor tipos, que por definición no puede ser nulo.
  • Lo mismo con DateTime.MinValue - DateTime es un tipo de valor, y no puede ser nulo, por lo que puede tener una convención que un valor conocido, como DateTime.MinValue se trata como si fuera nulo. También tiene otros usos.
+0

No estoy de acuerdo con el último punto ... DBNull no se reemplaza por el tipo Nullable. – Cerebrus

+0

DateTime.MinValue no es solo una convención. Es el valor de una variable DateTime si aún no se le ha asignado nada. –

+0

@Cerbrus: También disputaría el último punto. DBNull no representa nulo en C#, sino en la base de datos. Mientras Nullable es nulo en C#. – Samuel

1

A Null valor representa cualquier objeto de tipo de referencia que todavía no ha asignado su memoria.

MinValue no representa un Null, sino que es una propiedad que se utiliza a menudo para representar el menor valor constante posible que un tipo de valor determinado puede tener.

La clase DBNull.Value es una asignación de los nulos devueltos/pasados ​​a una base de datos.

El tipo genérico anulable le permite asignar valores nulos a un tipo de valor.

0

Tipos de referencia (también conocido como objetos) se pueden ajustar a nulo desde variables de tipo de referencia es sólo un puntero a la instancia actual. Indicar la falta de una instancia es fácil ya que puede establecer la variable como nula directamente.

Para los tipos de valor esto es un poco más difícil ya que una variable de tipo valor siempre contiene un valor. Por lo tanto, el uso de Double.MinValue o DateTime.MinValue era algo válido en los días previos a Nullable. En aquel entonces no había una forma fácil de expresar la falta de un valor en los tipos de valor.

Ahora, con tipos anulables se puede decir:

double? d = null; 

Y así también puede haber variables de tipo de valor que contiene nula.

System.DBNull es una historia diferente ya que está directamente relacionada con la expresión del valor "NULL" en los conjuntos de datos. Esto fue introducido antes de los tipos anulables que imo reemplaza a DBNull.

0

mayoría de los tipos de .NET son de referencia tipos, y null "no es una referencia" que se puede asignar a una variable o campo para indicar que no hay objeto.

Todos los otros tipos en .NET son tipos de valor. Siempre hay un valor con un tipo de valor, por lo que no se puede indicar "sin valor". Por lo tanto, una implementación puede definir valores especiales específicos para indicar esto. A menudo, el campo de tipo de valor MinValue (constante) se utiliza para esto. Por lo tanto, el uso de DateTime.MinValue para una fecha de nacimiento puede indicar "no conocido" o "no aplicable" (por ejemplo, para una entidad corporativa).

DbNUll existe para expresar el significado RDBMS de NULL que es un poco diferente a .NET. En la mayoría de los casos, esto se traducirá como nulo o similar.

Por último, Nullable<T> es un contenedor para los tipos de valor para expresar de manera más directa "no se sabe", y es generalmente una opción mejor que el uso MinValue, pero se añadió en .NET 2, por lo que los antiguos diseños pueden haber comenzado a usar MinValue antes Nullable<T> está disponible.

0

la mejor manera para que tou Para entender esto diferentes valores nulos es probarlos y ver lo que el uso de cada uno, sino hacer las cosas simples aquí es una guía

  • nula puede ser utilizado sólo en los tipos de referencia como colecciones y clases personalizadas (la cadena es especial)
  • DBNull es para valores nulos que salieron de la consulta db.
  • porque no podemos asignamos nula a un decimal o doble que les asignamos con la propiedad MinValue (que son objetos de valor)

  • anulable es una manera para que el desarrollador para asignar valores nulos a los objetos de valor como decimal, Nullable<int> is same as int?


espero que ayudó a la comprensión de las diferencias.

5
  • null sólo es válida para referencia tipos: los tipos que son un class en lugar de un structure.
  • .Net también tiene tipos de valores: int, double, DateTime, etc. Los tipos de valores no pueden ser nulos, por lo que normalmente los compara con su valor predeterminado, que suele ser type.MinValue, pero podría ser algo (considere Booleano, ejemplo).
  • Nullable<T> es para cuando tiene un tipo de valor que realmente podría ser nulo. El valor predeterminado (quizás MinValue) también es válido y necesita distinguirlo de cuando la variable no se ha asignado todavía. En C#, puede usar a? con un tipo de valor como notación de mano corta (por ejemplo: int?), pero aún está creando el mismo Nullable<T>.
  • DBNull se refiere específicamente a los valores NULL de una base de datos. No es lo mismo que usar null en otro lugar del idioma: solo es para hablar con una base de datos, de modo que pueda saber cuándo una consulta arrojó un valor nulo.
  • Al usar genéricos, también verá la construcción default(T) utilizada, donde T es un parámetro de tipo. Esto le permite establecer el valor predeterminado de un tipo sin saber si ese tipo es un tipo de referencia o un tipo de valor, y mucho menos cuál podría ser el valor predeterminado del tipo de valor específico.
0

La diferencia importante aquí es que entre los tipos de valores y los tipos de referencia. Los tipos de valores representan directamente un cierto valor, mientras que los tipos de referencia apuntan a una ubicación de memoria que debe representar un valor. Cuando un tipo de referencia en realidad no apunta a una ubicación de memoria con contenido válido, la referencia es nula.

Como los tipos de valores son representaciones de valor directas, no pueden ser nulos. Sin embargo, podría darse el caso de que se desconozca el valor real de un tipo de valor. Para este caso, .Net proporciona la construcción de tipos Nullable. Sin embargo, cuando tal construcción no está disponible, las personas tienden a usar valores especiales o predeterminados, como MinValue.

Al comunicarse con las bases de datos, muchas de las cosas que esperamos que sean tipos de valores pueden ser nulas, ya que es la forma en que la base de datos maneja los valores desconocidos. Esto también se puede resolver con los tipos Nullable, pero estos no siempre están disponibles. Es por eso que existe DBNull, para hacer frente a un posible nulo en una base de datos.