el Guille, la Web del Visual Basic, C#, .NET y más...

Novedades de Visual Basic 9.0

(Parte 4 de 9)

 
Publicado el 22/Jul/2007
Actualizado el 22/Jul/2007
Autor: Guillermo 'guille' Som

Novedades de Visual Basic 9.0 (Parte 4 de 9): Métodos extensores. Tipos anulables.



 

Métodos extensores

En inglés Extension methods. Esto lo que nos permite es "ampliar" la funcionalidad de una clase o tipo.

La forma de ampliar (o extender) la funcionalidad de un tipo es... ¡añadiéndole funcionalidad!
Vale, esto ya se puede hacer, pero... ¿y si quieres añadir funcionalidad a una clase existente? Por ejemplo, a una clase definida en el propio .NET. Digamos a la clase String. ¿Cómo lo harías? Actualmente no puedes. Pero con el .NET Framework 3.5 (el que se incluye con Visual Studio 2008), si que podrás.

Por ejemplo, imagina que te interesaría que las cadenas tuvieran una función que te permitiera quitar todos los espacios, incluidos los que están en medio de la cadena, podrías definir una función como esta:

<System.Runtime.CompilerServices.Extension()> _
Public Function MidTrim(ByVal s As String) As String
    Dim sb As New System.Text.StringBuilder
    For Each c In s
        If Char.IsSeparator(c) = False Then
            sb.Append(c)
        End If
    Next
    Return sb.ToString
End Function

Y la usarías desde cualquier variable (o constante) de tipo String, por ejemplo:

Dim sinEspacios = "Hola Mundo de las Extensiones".MidTrim

Por supuesto, cada vez que Intellisense te mostrara las "cosas" que puedes usar en un tipo String, también te mostraría ese método que has definido para que se use con la clase String, tal como puedes ver en la figura 2:

Figura 2. Los métodos extensores
Figura 2. Los métodos extensores 

Si te fijas en la figura 2, verás que los métodos "extensores" tienen una flecha azul que indica que no es algo que forme parte de ese tipo, sino que se ha "agregado".

En Visual Basic los métodos extensores se definen en un módulo (Module) y deben tener el atributo Extension que está definid en el espacio de nombres System.Runtime.CompilerServices. Y el primer parámetro de ese método será el tipo que estamos extendiendo. Ese primer parámetro no puede ser ni Optional ni ParamArray.

En la CTP de Junio 2007 no se puede "sobrecargar" a un método que ya exista, pero según parece en la Beta 2 si que se podrá. Esto es muy importante, ya que puedes crear métodos que ya existen en esa clase (o tipo) y puedes crear tu propia sobrecarga.

 

Tipos anulables

En inglés: Nullable types, esta es otra característica que ya tenía C# 2.0, y ahora, "gracias" a LINQ, pues... VB9 también la tiene.

Si sabes cómo se usa en C#, pues... en VB se usa de la misma forma. Es decir, los tipos se definen añadiendo una interrogación al tipo, por ejemplo:

Dim i1 As Integer?
i1 = 22

If i1.HasValue Then
    Console.WriteLine(i1.Value)
End If

En este ejemplo, la variable i1 es del tipo Nullable(Of Integer) y además de admitir los valores de un Integer, también acepta valores Nothing, pero en este caso con el significado de "nulo", algo que puede ser muy útil cuando accedemos a una base de datos.

Los tipos anulables también se pueden "inferir", al menos si la variable que hay a la derecha del signo igual es del tipo anulable:

Dim i2 As Integer? = 15

' También existe la inferencia de tipos
' entre tipos anulables
Dim i3 = i2

Si queremos asignar el valor de un tipo anulable a una variable, tenemos que usar la propiedad Value, pero debido a que el valor que contiene puede ser nulo, se debe comprobar antes si tiene un valor "válido", esto último se hace con HasValue:

Dim j As Integer

If i1.HasValue Then
    j = i1.Value
End If

Pero para evitar tener que hacer la comparación, podemos usar el método GetValueOrDefault, este método devolverá el valor que tiene la variable, pero si lo que tiene es un valor nulo, devolverá el valor por defecto de ese tipo de datos. En el caso de los números, devolverá 0.
También podemos indicarle un parámetro a esa función, de forma que si la variable tiene un valor nulo, el valor que se devuelva sea el que indiquemos. Por ejemplo, en el siguiente código, si la variable i1 tiene un valor nulo, devolverá 7. Como puedes ver, la "inferencia" se puede usar en todos los casos, en este caso, la variable i será de tipo Integer, que es el tipo de datos que se devuelve con GetValueOrDefault, ya que la variable i1 es de tipo Integer? (un entero anulable):

' Si i1 es nulo, se asignará 7
' (La variable i es de tipo Integer)
Dim i = i1.GetValueOrDefault(7)

 

 

Actualmente, con Visual Basic 2005, se pueden definir los tipos usando Nullable(Of Tipo), y si quieres ver cómo usarlos, (tanto en VB como en C#), puedes ver esto que publiqué hace tiempo e incluso puedes usar el código que creé (en una librería) para "simular" esta característica en Visual Basic 2005

 


Ir al índice de las novedades de Visual Basic 2008 (VB 9.0)


Código de ejemplo (comprimido):

Para bajarte el código, hazlo desde la página principal de
Las Novedades de Visual Basic 9.0 con la CTP de Junio 2007.


 


La fecha/hora en el servidor es: 23/11/2024 0:50:38

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024