es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Nullables y Not .HasValue vs IsNothing Nothing Los estructuras nullables son tipos de datos en lenguajes de programación que pueden contener un valor nulo además de sus valores normales. Esto significa que una variable puede ser null o tener un valor válido asignado. En el caso de los nullables en C#, se puede utilizar la propiedad .HasValue para determinar si el nullable tiene un valor asignado o no. Por ejemplo, si tenemos un nullable int llamado “num”, podemos verificar si tiene un valor usando la siguiente condición: “if (num.HasValue)”. Por otro lado, en VB.NET, se utiliza la palabra clave “IsNothing” para verificar si un objeto es nulo. Si tenemos una variable llamada “obj” y queremos saber si contiene un valor o es nulo, podemos utilizar la siguiente condición: “If IsNothing(obj) Then”. En resumen, la propiedad .HasValue en C# y la palabra clave IsNothing en VB.NET se utilizan para verificar si un nullable o un objeto es nulo o tiene un valor asignado, respectivamente.

Me he encontrado con un ‘interesante’ dilema con un código que he escrito y no puedo encontrar una explicación adecuada de por qué una aparente ‘solución’ funciona donde el código original no lo hacía.

Tengo una lista de objetos con cálculos asociados que se van construyendo unos sobre otros, y para evitar una disminución exponencial del rendimiento, empecé a almacenar en caché algunos valores clave (almacenados en Nullable) que miran hacia atrás en elementos anteriores de la lista. Para borrar los valores en caché, los establezco como Nothing y tengo una lógica para comprobar eso con el fin de recalcularlos una vez cuando sea necesario.

La declaración de la variable:

Dim _nullable As System.Decimal? = Nothing

El código original:

If (Not Me._nullable.HasValue OrElse Me.OtherCondition) Then

El código ‘corregido’:

If (Me._nullable Is Nothing OrElse Not Me._nullable.HasValue OrElse Me.OtherCondition) Then

Todo lo que entiendo sobre las Nullable de .NET indica que esas dos condiciones deberían ser funcional y lógicamente idénticas, pero cambiar la primera por la segunda solucionó un error.

¿Hay alguna diferencia funcional entre las dos condiciones que simplemente no estoy viendo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en una diferencia en cómo el compilador de VB.net maneja los operadores de comparación “Is” y “Not”. “Is” verifica la igualdad de referencia, mientras que “Not” verifica la desigualdad de valor.

    En el código original, la condición “Not Me._nullable.HasValue” devolvería True si la variable fuera Nothing o no tuviera valor, ya que ambos casos se evaluarían como “Not True”. Sin embargo, en el código “corregido”, la condición “Me._nullable Is Nothing” verifica explícitamente el caso de Nothing, evitando así cualquier confusión potencial con el operador “Not”.

    En general, parece que el problema era simplemente una sutileza en la sintaxis y el comportamiento del código que no era evidente de inmediato.

Comments are closed.