net genericas example clases .net vb.net generics

.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