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

Novedades de Visual Basic 9.0

(Parte 2 de 9)

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

Novedades de Visual Basic 9.0 (Parte 2 de 9): Ensamblados amigos. Relajación de delegados. Agilidad del runtime. Llamada a miembros de Object en las interfaces. Operador ternario. Inferencia mejorada de tipos generic.



 

Ensamblados amigos

En inglés: Friend assemblies. Es la posibilidad que desde un ensamblado puedas acceder a los tipos y demás código que están declarados como Friend en otro ensamblado. Como sabrás, todo lo que se declare como Friend (internal en C#) solo será accesible desde el propio ensamblado.

De esto te hablé con anterioridad. Pulsa en este link para saber sobre los ensamblados amigos,, tanto en Visual Basic 9.0 como en C# 2.0 y posterior.

 

Relajación de delegados

En inglés: Relaxed delegates. La relajación de delegados es algo que C# 2.0 (C# 2005) ya tenía, aunque en Visual Basic 9 se ha "ampliado".
Lo que significa es que si en un parámetro de un delegado se espera un tipo de datos, se puede usar otro que esté en la misma jerarquía de clases (contravarianza).
Por ejemplo, si el delegado define un parámetro que deba ser el tipo RoutedEventArgs, tipo que se deriva de EventArgs, y éste último de Object, la contravarianza permite que podamos usar cualquiera de esos tipos que estén en la jerarquía de tipos (es decir en el árbol de herencia).
Pero en Visual Basic 9 esa relajación llega al extremo de incluso NO estar obligado a indicar ningún tipo de argumento. Esto último es muy práctico en el caso de los métodos de evento. Por ejemplo, si en el evento Click de un control no queremos indicar ningún parámetro, pues... ¡no hace falta indicarlo!

Por tanto, podemos definir un método del evento Click de esta forma:

Private Sub Button1_Click() Handles Button1.Click
    MessageBox.Show("Has pulsado en el botón", _
                    "Relajación de delegados")
End Sub

Por supuesto, puedes seguir usando la forma "habitual":

Private Sub Button2_Click(ByVal sender As Object, _
                          ByVal e As System.EventArgs) _
                          Handles Button2.Click
    ' Esta es la forma normal
End Sub

O la "relajada", fíjate que el segundo parámetro está definido como Object, esto si se puede hacer en C#:

Private Sub Button3_Click(ByVal sender As Object, _
                          ByVal e As Object) _
                          Handles Button3.Click
    ' El segundo parámetro está "relajado"
End Sub

 

Agilidad del runtime

En inglés: Runtime agility. Esto más o menos viene a significar que los programas de Visual Basic 2008 (o VB9) ya no necesitan obligatoriamente que se compile usando el runtime de Visual Basic, algo que hasta ahora siempre ha sido así, es decir, lo quisieras o no, siempre se incluía una referencia a la librería Microsoft.VisualBasic.dll.

Ahora con Visual Basic 9.0, si no quieres que se incluya esa DLL o quieres usar otra diferente a la "por defecto", puedes compilar con la opción /vbruntime, pero tendrás que hacerlo desde la línea de comandos, ya que el Visual Studio 2008 (o el IDE de Visual Basic 2008) no lo soporta.

Pero no solo significa que no uses un runtime de VB, sino que puedes indicar cual quieres usar... aunque esto en realidad solo será "válido" para el tema de SilverLight o de Compact Framework, al menos cuando haya otros "runtimes de VB" que se puedan usar.

Si quieres saber más, puedes ver el post de Paul Vick: VB Runtime agility, Orcas and new platforms.

Esto no lo he podido probar, ya que "supuestamente" estará en la Beta 2, aunque si buscas en la ayuda de la CTP de Junio, si que te dice que existe esa opción del compilador.

Para que te hagas una idea, usar esa opción en el compilador vendría a equivaler a solo poder usar las clases de .NET, es decir, nada de My, ni nada de esas cosas que VB ya incluye. Aunque eso sí, los ejecutables son "más pequeños", al menos en todo lo que se refiere al "soporte" para el runtime de VB y los "Mys".
Y según me ha dicho un "pajarito" sólo se permiten clases, es decir, que no puedes compilar nada que tenga un módulo de VB, es decir, no soporta el "tipo" Module. Sí, Module es una característica "propia" de VB. Aunque el compilador seguirá creando automáticamente el constructor, etc., aunque eso también lo hace el compilador de C#.

 

Llamada a miembros de Object en las interfaces

En inglés es: Calling Object members on interfaces y significa que en una variable del tipo de una interfaz se puede llamar a métodos definidos en Object, por ejemplo ToString.
Y como te puedes imaginar, si en la clase que implementa la interfaz define su propia versión de ese método, pues se usará esa implementación.

Aquí tienes un ejemplo:

Module Module1
    Sub Main()
        Dim ip As IPrueba = New Prueba
        ip.Mostrar()
        Console.WriteLine(ip.ToString())

        Console.ReadKey()
    End Sub
End Module

Interface IPrueba
    Sub Mostrar()
End Interface

Class Prueba
    Implements IPrueba

    Public Sub Mostrar() Implements IPrueba.Mostrar
        Console.WriteLine("Hola desde Prueba")
    End Sub

    Public Overrides Function ToString() As String
        Return "ToString en la clase Prueba"
    End Function
End Class

Esto en C# 2.0 (C# 2005) ya se podía hacer.

 

Operador ternario

En inglés: Ternary operator. Esto es algo que Visual Basic nunca ha tenido y muchos "pedíamos", en C/C# es el operador ?: que se usa de esta forma:

string s = 10>5? "10 es mayor que 5":"10 no es mayor que 5";

Es decir, se evalúa una expresión y si se cumple, se usa lo que hay después de la interrogación ?, si no se cumple, se usa lo que haya después de los dos puntos :.

En Visual Basic 9.0 se usa con el IF normal, pero en "modo función", y sería el equivalente a IIF, con la ventaja de que el tipo de datos devuelto no hay que "convertirlo", ya que si lo que se devuelve es una cadena, pues el tipo devuelto (o valor) es una cadena, que es un tipo Double, pues... es decir, está "mejorado" con respecto a lo que teníamos con el actual IIF.

La forma de usar el operador ternario en Visual Basic 2008 es esta:

Dim s As String = If(10 > 5, "10 es mayor que 5", "10 no es mayor que 5")

 

Inferencia mejorada de tipos generic

En inglés: Improved generic type inferencing. Pues... déjame que lo piense... ¡ni idea! aunque supongo que será como lo de los delegados relajados, pero con parámetros genéricos, es decir, si hay varios parámetros genéricos que en un tipo se define de una forma y en otro de otra, por ejemplo, Long e Integer, pues se usará el que sea más "amplio" o que tenga más capacidad, en este caso el Long (o desea como lo ha traducido el traductor automático ese).
Cuando vea algún ejemplo de esto, pues... te lo explicaré mejor, pero ahora mismo me "pilla" off... :(


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 características:
Las Novedades de Visual Basic 9.0 con la CTP de Junio 2007.


 


La fecha/hora en el servidor es: 23/12/2024 18:31:34

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024