vb.net - property - variable null vb net
Historia de la sintaxis Nullable de VB.NET (4)
No conozco la historia, pero sí fue una mejora de VS 2008.
No puedo encontrar una respuesta definitiva. Desde C # 2.0 has podido declarar
int? i = 125;
como taquigrafía para
Nullable<int> i = Nullable<int>(123);
Recuerdo haber leído en alguna parte que VB.NET no permitió este atajo. Pero bajo y he aquí, lo intenté en VS 2008 hoy y funciona.
¿Alguien sabe si ha sido así desde .NET 2.0 o se agregó después?
System.Nullable se introdujo en .Net 2.0 y está disponible para VB como un tipo genérico . Usted simplemente no puede usar la sintaxis nullable. Entonces en VS 2005 puedes hacer:
Dim x as Nullable(of Integer)
No sé si la equivalencia nula y el boxeo funcionan para nulables en VB 2005, pero sospecho que la respuesta es sí, ya que el equipo de .Net realizó un cambio en el CLR 2.0 para lograr el boxeo con nulables. Me imagino que VB aprovecha esto.
En 2008, obviamente puede simplemente hacer:
Dim x as Integer?
funciona en VB 2005 (dotnet 2.0) pero es feo.
No puede usarlo como una variable normal, pensé que podría funcionar como un tipo de objeto pero no es así.
En vez de esto:
dim oInt as object
dim i as integer
if oInt is nothing then
msgbox("int is null")
else
i = cint(oInt)
end if
Tu tienes esto.
Dim oInt as nullable(of integer)
dim i as integer
if oInt.HasValue = false then
msgbox("int is null")
else
i = oInt.Value
end if
El problema aquí es que si su variable es nula e invocará la propiedad Value, mostrará una excepción no controlada.
así que, por ejemplo, mi favorito es esto.
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))
¡Causará un error de tiempo de ejecución cuando su valor de Supposed Nullable sea nulo!
así que aquí es nullable (de entero) vs Código de objeto
nullable (de entero)
if oInt.HasValue then
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt.Value)
else
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, dbnull.value)
end if
Objeto
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)
IIRC, los tipos anulables se introdujeron en .NET 2.0 en una etapa muy avanzada. El equipo del compilador de C # logró incluir más soporte de idiomas para ellos que el equipo de VB.NET. El equipo de VB.NET más o menos atrapado en VS2008. Es por eso que puede, por ejemplo, usar el operador == para comparar elementos nulables en C # 2.0, mientras que en VB.NET debe soportar el método Nullable.Equals (). Grrr.