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
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.
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)