.net - example - clases genericas vb net
¿Cuál es el equivalente de `default` de C#en VB.NET? (3)
Normalmente estoy en casa en C #, y veo un problema de rendimiento en algún código VB.NET. Quiero poder comparar algo con el valor predeterminado para un tipo (algo así como la palabra clave default
C #)
public class GenericThing<T1, T2>
{
public T1 Foo( T2 id )
{
if( id != default(T2) ) // There doesn''t appear to be an equivalent in VB.NET for this(?)
{
// ...
}
}
}
Me hicieron creer que Nothing
era semánticamente igual, pero si lo hago:
Public Class GenericThing(Of T1, T2)
Public Function Foo( id As T2 ) As T1
If id IsNot Nothing Then
'' ...
End If
End Function
End Class
Entonces, cuando T2
es Integer
y el valor de id
es 0
, la condición aún pasa y el cuerpo de if
se evalúa. Sin embargo si lo hago:
Public Function Bar( id As Integer ) As T1
If id <> Nothing Then
'' ...
End If
End Function
Entonces la condición no se cumple, y el cuerpo no se evalúa ...
A diferencia de C #, VB.NET no requiere que una variable local se inicialice con una expresión. Se inicializa a su valor predeterminado por el tiempo de ejecución. Justo lo que necesita como sustituto de la palabra clave predeterminada :
Dim def As T2 '''' Get the default value for T2
If id.Equals(def) Then
'''' etc...
End If
No olvides el comentario, va a hacer que alguien diga ''¿Eh?'' Un año por ahora.
El problema en su código es el operador IsNot
, no la palabra clave Nothing
. De los docs :
El operador IsNot determina si dos referencias de objeto se refieren a objetos diferentes. Sin embargo, no realiza comparaciones de valores.
Estás intentando hacer una comparación de valores con un operador de referencia. Una vez que te das cuenta de esto, las respuestas de Jon Skeet o Hans Passant se convierten en soluciones obvias.
Esta no es una solución completa, ya que su código original de C # no se compila. Puedes usar Nothing a través de una variable local:
Public Class GenericThing(Of T)
Public Sub Foo(id As T)
Dim defaultValue As T = Nothing
If id <> defaultValue Then
Console.WriteLine("Not default")
Else
Console.WriteLine("Default")
End If
End Function
End Class
Eso no se compila, de la misma manera que la versión de C # no compila, no se pueden comparar valores de parámetros de tipo sin restricciones de esa manera.
Sin embargo, puede usar EqualityComparer(Of T)
, y ni siquiera necesita la variable local:
If Not EqualityComparer(Of T).Default.Equals(id, Nothing) Then