Miniapunte que puede parecer absurdo pero que me ha hecho perder un ratito. El caso es que estaba intentando conseguir que un atributo de tipo Integer sin inicializar tuviera un valor nulo, para así poder insertarlo en un registro de una tabla de base de datos como NULL, ya que dada la naturaleza del atributo, un valor 0 (que es como un atributo de tipo Integer queda automáticamente inicializado) y un valor NULL significan cosas muy distintas. Pero resulta que no se puede hacer, ya que Integer no es una clase en VisualBasic.NET sino sólo un tipo de datos.
En el caso de un atributo de tipo String no hay problema, porque String sí puede ser una clase y por tanto sí acepta valores nulos, pero no así en el caso de Integer y Double, que son sólo tipos de datos y automáticamente quedan inicializados a 0. La solución -no óptima- puede pasar por utilizar la clase Object en su lugar o bien -algo más óptima en tanto que menos genérica- utilizar la clase Nullable y crear el atributo de tipo Nullable (Of Integer) o Nullable (Of Double).
Y la confusión me ha venido motivada porque en Java Integer sí es una clase…
En los grupos de discusión de Microsoft, Enrique Martínez ha dado una excelente explicación que copio literalmente:
«Tipos de datos» son todos: el tipo de dato Integer, el tipo de datos String, el tipo de datos Object, etc. Lo que ocurre es que mientras que los tipos de datos Object y String están definidos como «Class» (un tipo de datos por referencia), los tipos de datos como Short, Integer, Long, Single, Double, etc., se encuentran definidos como «Structure» (un tipo de datos por valor). Por este motivo, los valores de los tipos de datos «por referencia» (las clases), se inicializan a un valor «Nothing» en Visual Basic, mientras que los valores de los tipos de datos «por valor» (las estructuras), en principio se inicializan a 0.
Resumiendo, ante el código siguiente:
Debug.Print(”El valor de n es: ” & n.ToString)
Debug.Print(”¿Es n nulo? ” & IsNothing(n))
Se obtiene la salida:
¿Es n nulo? False
Mientras que ante este otro código:
Debug.Print(”El valor de n es: ” & n.ToString)
Debug.Print(”¿Es n nulo? ” & IsNothing(n))
Obtenemos esta otra salida:
¿Es n nulo? True
Ídem con Double, Long… ![]()
0 Respuestas a “Integer en VisualBasic.NET no es una clase.”
Añade un Comentario