Saltar al contenido

¿Por qué hay una diferencia en la comprobación null contra un valor en VB.NET y C#?

Estate atento porque en esta crónica encontrarás la solución que buscas.Este artículo fue analizado por nuestros expertos para garantizar la calidad y exactitud de nuestro contenido.

Solución:

VB.NET y C#.NET son lenguajes diferentes, construidos por diferentes equipos que han hecho diferentes suposiciones sobre el uso; en este caso, la semántica de una comparación NULL.

Mi preferencia personal es por la semántica de VB.NET, que en esencia le da a NULL la semántica “Todavía no lo sé”. Luego la comparación de 5 con “Todavía no lo sé”. es naturalmente “Todavía no lo sé”; es decir, NULO. Esto tiene la ventaja adicional de reflejar el comportamiento de NULL en (la mayoría, si no todas) las bases de datos SQL. Esta es también una interpretación más estándar (que la de C#) de la lógica de tres valores, como se explica aquí.

El equipo de C# hizo diferentes suposiciones sobre lo que significa NULL, lo que resultó en la diferencia de comportamiento que muestra. Eric Lippert escribió un blog sobre el significado de NULL en C#. Según Eric Lippert: “También escribí sobre la semántica de nulos en VB/VBScript y JScript aquí y aquí”.

En cualquier entorno en el que los valores NULL son posibles, es importante reconocer que la Ley del Medio Excluido (es decir, que A o ~A es tautológicamente true) ya no se puede confiar.

Actualizar:

A bool (a diferencia de un bool?) solo puede tomar los valores VERDADERO y FALSO. Sin embargo, una implementación de lenguaje de NULL debe decidir cómo NULL se propaga a través de expresiones. En VB las expresiones 5=null y 5<>null AMBOS regresan false. En C#, de las expresiones comparables 5==null y 5!=null Solo el segundo primero [updated 2014-03-02 – PG] devoluciones false. Sin embargo, en CUALQUIER entorno que admita nulles responsabilidad del programador conocer las tablas de verdad y null-propagación utilizada por esa lengua.

Actualizar

Los artículos del blog de Eric Lippert (mencionados en sus comentarios a continuación) sobre semántica están ahora en:

  • 30 de septiembre de 2003 – Un montón de nada

  • 1 de octubre de 2003 – Un poco más sobre nada

Porque x <> y devoluciones Nothing en vez de true. Simplemente no está definido ya que x no está definido. (similar a SQL null).

Nota: VB.NET Nothing <> C# null.

También tienes que comparar el valor de un Nullable(Of Decimal) sólo si tiene un valor.

Entonces, el VB.NET anterior se compara de manera similar a esto (que parece menos incorrecto):

If x.HasValue AndAlso y.HasValue AndAlso x <> y Then
    Console.WriteLine("true")
Else
    Console.WriteLine("false")  
End If

La especificación del lenguaje VB.NET:

7.1.1 Tipos de valores anulables
… Un tipo de valor anulable puede contener los mismos valores que la versión no anulable del tipo, así como el null valor. Por lo tanto, para un tipo de valor anulable, al asignar Nothing a una variable del tipo, se establece el valor de la variable en el null valor, no el valor cero del tipo de valor.

Por ejemplo:

Dim x As Integer = Nothing
Dim y As Integer? = Nothing

Console.WriteLine(x) ' Prints zero '
Console.WriteLine(y) ' Prints nothing (because the value of y is the null value) '

Mire el CIL generado (he convertido ambos a C#):

C#:

private static void Main(string[] args)

        (CS$0$0000.HasValue != CS$0$0001.HasValue))
    
        Console.WriteLine("true");
    
    else
    
        Console.WriteLine("false");
    

Básico visual:

[STAThread]
public static void Main()

    decimal? x = null;
    decimal? y = null;
    y = 5M;
    bool? VB$LW$t_struct$S3 = new bool?(decimal.Compare(x.GetValueOrDefault(), y.GetValueOrDefault()) != 0);
    bool? VB$LW$t_struct$S1 = (x.HasValue & y.HasValue) ? VB$LW$t_struct$S3 : null;
    if (VB$LW$t_struct$S1.GetValueOrDefault())
    
        Console.WriteLine("true");
    
    else
    
        Console.WriteLine("false");
    

Verá que la comparación en Visual Basic devuelve Nullable (no bool, false o true!). Y undefined convertido a bool es false.

Nothing comparado con lo que sea siempre Nothingno false en Visual Basic (es lo mismo que en SQL).

Reseñas y valoraciones del tutorial

Al final de la página puedes encontrar las crónicas de otros gestores de proyectos, tú igualmente tienes la opción de dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *