Pregunta

Estoy un poco confundido acerca de los valores nulos y las variables en .NET. (VB preferido)

¿Hay alguna forma de verificar la " nulidad " de CUALQUIER variable dada independientemente de si era un objeto o un tipo de valor? ¿O mi comprobación nula siempre tiene que anticipar si se trata de verificar un tipo de valor (por ejemplo, System.Integer) o un objeto?

Supongo que lo que estoy buscando es una función que verifique todo tipo posible de nulidad. Es decir, cualquier tipo de variables que

a) nunca se les asignó un valor desde que se declaró

b) se les asignó un valor nulo de un objeto de datos (que provenía de una base de datos)

c) se establecieron iguales a otro valor variable que era nulo

d) se establecieron en una sesión / variable de aplicación ASP.NET que nunca se configuró o expiró.

¿Existe una práctica recomendada general cuando se trata de manejar escenarios nulos en .NET?

ACTUALIZACIÓN: Cuando hablo de que un tipo de valor es " null " ;, lo que realmente quiero decir es un tipo de valor que nunca se configuró o estuvo en algún momento establecer igual o emitir desde un objeto nulo.

¿Fue útil?

Solución

Los tipos de valores normales (booleanos, ints, longs, float, double, enum y structs) no son anulables.

El valor predeterminado para todos los tipos de valor es 0.

El CLR no le permitirá acceder a las variables a menos que se hayan configurado. Puede pensar que este no es siempre el caso, pero a veces el CLR interviene y los inicializa por usted. A nivel de método, debe inicializar explícitamente todas las variables antes de usarlas.

Además, como otros señalan, desde .net 2.0 hay un nuevo tipo genérico llamado Nullable<T>. Hay algunas compilaciones de shorthands en C # como int? significa Nullable<int>, doble? significa Nullable<double> etc.

Solo puede ajustar x.HasValue() sobre tipos de valores no anulables, lo cual está bien ya que las referencias ya tienen la capacidad de ser nulas.

int? x = null;

¿Para un int ?, aunque puedes probar contra nulo, a veces es mejor llamar a <=>.

En C # también está el operador coalescente anulable ?? cuando desea asignar un valor anulable a un tipo de valor no anulable. Pero si no tiene el operador, puede llamar a GetValueOrDefault ().

int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y

Otros consejos

Los tipos de valor no pueden ser nulos. Viola lo que significa ser un Tipo de valor. Puede ajustar los Tipos de valor como Nullable (Of T), lo que le ofrece un gran conjunto de métodos y comprueba que Nada funcione. Pero sí tiene muchos gastos generales con esa envoltura. ¿Quizás pueda aclarar lo que está tratando de hacer?

Para completar, la sintaxis de VB para envoltorios anulables es:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'

EDITAR: El tipo de valor siempre se preinicializa a un valor predeterminado, 0 para números, falso para booleanos, etc.

¿Es esto lo que buscas?

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If

En verdad, no estoy seguro de por qué desearías esta estructura. El único momento en que comprobaría DBNULL.Value es cuando estoy usando valores que provienen de una base de datos, y antes de asignar dicho valor de una clase de espacio de nombres DATA a otra clase [es decir dim b como cadena = dataReader (0)].

Normalmente, si le preocupa que un objeto no haya sido instanciado, o que necesite que se vuelva a instanciar, solo bastará una comprobación IsNothing.

En .Net que son solo dos tipos de nulos que conozco, nulos (nada en VB) y DbNull. Si está utilizando un System.Nullable, puede usar la misma sintaxis de comprobación nula que utilizaría con un objeto. Si si su objeto anulable está en caja, el .Net 2.0 CLR es lo suficientemente inteligente como para encontrar la manera correcta de manejar esto.

El único caso que he encontrado en ambos tipos es en el nivel de datos de una aplicación donde podría estar accediendo a los datos de la base de datos directamente. Por ejemplo, me he encontrado con DbNull en una DataTable. Para verificar estos dos tipos nulos en esta situación, puede escribir un método de extensión como (lo siento, en C #):

static public bool IsNull(this object obj)
{
    return obj != null && obj != DbNull.Value;
}

...

if(dataTable[0]["MyColumn"].IsNull())
{
  //do something
}

Las variables de tipo de valor no pueden contener nulo, porque eso significa nulo, nulo significa que las referencias no apuntan a ninguna parte. No lo sé en VB.net, pero en c # puede ajustar los tipos de valores para que sean anulables utilizando & Quot;? & Quot ;, como:

int? a = null;

Mientras desarrolle con Option Strict On, (a) no debería ser un problema. El compilador te gritará. Si le preocupa verificar los parámetros, simplemente use

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer)
    if param1 is nothing then
         Throw New ArgumentException("param1 cannot be null!")
    end if
    'param2 cannot be null
End Sub

Para (b), la capa de interacción de la base de datos debe manejar esto. Si está utilizando LINQ, hay formas de manejar esto. Si está utilizando conjuntos de datos escritos, hay una propiedad .IsMyVariableNull en la fila que se genera automáticamente.

Para (c), no necesita preocuparse por los tipos de valor, pero los tipos de referencia se pueden verificar con un simple Is Nothing (o IsNot Nothing).

Para (d), puede aplicar la misma lógica después de la lectura. Pruebe la variable de recepción contra Nothing.

En su mayor parte, una simple comprobación de Is Nothing te ayudará. La capa de interacción de la base de datos lo ayudará a manejar el caso más difícil de valores nulos en sus datos, pero depende de usted manejarlos adecuadamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top