Archivo de la categoría: General

¿Visual Basic .NET ó C#?

Introducción

Este artículo ofrece un breve análisis acerca de Visual Basic .NET y C#, los dos lenguajes más utilizados de la plataforma .NET, desde un punto de vista no técnico, sino de lo que ambos lenguajes pueden ofrecer a los desarrolladores; su objetivo es brindar una referencia para los desarrolladores que recién se inician con la plataforma .NET, y aún no deciden qué lenguaje utilizar.

¿VB .NET vs. C#?

Pareciera que estos dos lenguajes de la plataforma .NET se basan en una misma especificación; que se traducen a un lenguaje común antes de ser convertidos en código máquina y utilizan los mismos recursos del ambiente de ejecución; las mismas librerías de clases y, sobre todo, que su performace es igual, que no ha sido todavía asimilada, sobre todo por aquellos desarrolladores que anteriormente ya utilizaban lenguajes basados en C.

Gran polémica es la que despierta este tema, cada vez que alguien hace la pregunta ¿Cuál lenguaje es mejor: Visual Basic .NET ó C#? Siendo que esta pregunta tan simple puede responderse con otra pregunta igual de sencilla, y que por lo general nosotros mismos nos podemos contestar: ¿Cuál te gusta más? O puesto de otra manera: ¿Con cuál de los dos te sientes más cómodo? Y no es que uno sea mejor que el otro, sino que uno puede acoplarse mejor a nuestras habilidades y necesidades. Ahora, y como anteriormente ha sucedido, no faltará quien suponga que C# es mejor por ser un lenguaje basado en C; sin embargo, ¿Con qué fundamento se hacen estas suposiciones? Si has estudiado un poco la plataforma .NET sabrás ya que todos los lenguajes se “compilan” a un mismo lenguaje intermedio (aún cuando los archivos resultantes de esta compilación sean .EXE ó .DLLl), al cual normalmente se hace referencia como MSIL ó IL; y que además la plataforma cuenta con un componente conocido como CLR (Common Language Runtime) el cual se encarga, entre otras cosas, de convertir estas instrucciones en IL hacia código de máquina justo antes de su ejecución haciendo uso de un compilador JIT. Ahora, el punto importante en este párrafo es que “todos los lenguajes se compilan a un mismo lenguaje intermedio”, pues en ningún momento da pie a suponer que una aplicación escrita en C# nos dará como resultado un mejor IL que la misma aplicación escrita en Visual Basic .NET, o viceversa; tomando el clásico programa de ejemplo “hola mundo”, se puede comparar el IL generado en Visual Basic .NET con el generado en C#.

VB .NET

Module Hola Sub Main()
  Console.WriteLine("Hola mundo  desde una app en VB!!!")
   Console.Read()
   End Sub
 End Module
1. .method public static void  Main() cil managed
    2.  {
    3.  .entrypoint
    4.  .custom instance void [mscorlib] System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
    5.  // Code size 20 (0x14)
    6.  .maxstack 8
    7.  IL_0000: nop
    8.  IL_0001: ldstr "Hola mundo desde una app en VB!!!"
    9.  IL_0006: call void [mscorlib]System.Console::WriteLine(string)
    10. IL_000b:  nop
    11. IL_000c:  call int32 [mscorlib]System.Console::Read()
    12. IL_0011:  pop
    13. IL_0012:  nop
    14. IL_0013:  ret
    15. } // end of method Hola::Main

C#

class Class1 {
  [STAThread]
  static void Main(string[] args) {
    Console.WriteLine ("Hola mundo desde una app en C#!!!");
    Console.Read();
  }
}
1. .method private hidebysig static void  Main(string[] args) cil managed
    2.  {
    3.  .entrypoint
    4.  .custom instance void [mscorlib] System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
    5.  // Code size 17 (0x11)
    6.  .maxstack  1
    7.  IL_0000: ldstr "Hola mundo desde una app en C#!!!"
    8.  IL_0005: call void [mscorlib]System.Console::WriteLine(string) 
    9.  IL_000a:  call int32 [mscorlib]System.Console::Read()
    10. IL_000f: pop
    11. IL_0010: ret
    12. } // end of method Class1::Main

Lo primero que habrás notado es que el programa en Visual Basic .NET genera tres líneas más de código IL (las líneas 7, 10 y 13) que el programa en C#, y te preguntarás por qué. Esto es simplemente debido a que Visual Basic .NET permite agregar puntos de interrupción en líneas de código no ejecutable, como por ejemplo en un End Sub, y esto lo maneja agregando instrucciones nop (No Operation) al IL generado; sin embargo, estas instrucciones, de las cuales cabe mencionar que su consumo de ciclos de procesamiento es prácticamente nulo, solo son agregadas cuando la compilación se hace en modo de depuración, de manera tal  que si compilamos la misma aplicación utilizando la opción Release obtenemos el siguiente IL:

VB.NET

Module Hola
 Sub Main()
  Console.WriteLine("Hola mundo  desde una app en VB!!!")
  Console.Read()
  End Sub
End Module
1. .method public static void  Main() cil managed 
    2.  { 
    3.  .entrypoint 
    4.  .custom instance void [mscorlib] System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
    5.  // Code size 17 (0x11)
    6.  .maxstack 8
    7.  IL_0000: ldstr "Hola mundo desde una app en VB!!!"
    8.  IL_0005: call void [mscorlib]System.Console::WriteLine(string)
    9.  IL_000a: call int32 [mscorlib]System.Console::Read()
    10. IL_000f: pop
    11. IL_0010: ret
    12. } // end of method Hola::Main

Como se puede ver, es prácticamente igual al IL generado por la aplicación escrita en C#, y esto se debe precisamente a que todos los lenguajes de la plataforma .NET son traducidos al mismo IL y a que todos los lenguajes, para poder formar parte de la plataforma, deben cumplir con el CLS (Common Language Specification), que son todas las especificaciones necesarias para ser considerado como compatible, y asegurar la compatibilidad entre componentes escritos en los diferentes lenguajes.

Nota: el código presentado en el ejemplo anterior fue generado con el Visual Studio 2003, y para la visualización del IL puedes utilizar la utilería ILDASM.exe incluida con el SDK del .NET Framework.

Aún cuando todos los lenguajes de la plataforma .NET son traducidos a un mismo IL, las diferentes opciones de compilación pueden generar un IL drásticamente diferente, con sus consecuentes diferencias en desempeño. Lo que es un hecho es que los diferentes compiladores, por defecto, tienen diferentes opciones de compilación; por esta razón, es importante comprender cual es el resultado de compilar un programa con las diferentes opciones que ofrece un determinado compilador. Entendido esto, se puede asegurar que programas equivalentes, compilados con opciones equivalentes y aún cuando hayan sido escritos en diferentes lenguajes, siempre generaran el mismo IL, que una vez compilado por el CLR, se comportara, y tendrá un desempeño igual.

¿Qué dice Microsoft?

Solo basta con echar un vistazo al White Paper «Differences Between Microsoft Visual Basic .NET and Microsoft Visual C# .NET» para darnos cuenta de que ambos lenguajes son considerados igualmente poderosos y que realmente no existen argumentos para suponer que alguno de ellos es superior. El siguiente párrafo ha sido extraído precisamente de la introducción de ese documento.

«Debido a las diferencias del pasado entre Microsoft Visual Basic , Microsoft Visual C , y Microsoft Visual C++ , muchos desarrolladores tienen la impresión de que Microsoft Visual C# .NET es un lenguaje mucho más poderoso que Microsoft Visual Basic .NET. Algunos desarrolladores asumen que muchas cosas que son posibles en Visual C# .NET son imposibles en Visual Basic .NET; de igual forma en que muchas cosas que son posibles en Microsoft Visual C 6.0 ó Microsoft Visual C++ 6.0 son imposibles en Microsoft Visual Basic 6.0. Asumir esto es incorrecto. Si bien existen diferencias entre Visual Basic .NET y Visual C# .NET , ambos son lenguajes de programación de primera clase basados en el Microsoft .NET Framework , y ambos son igual de poderosos.»

Diferencias

Si revisamos un poco más este documento, encontraremos que muchas de las diferencias entre los lenguajes son puramente de sintaxis, y muchas tan triviales como que un entero se indica en en VB .NET con la palabra clave Integer, y en C# con la palabra clave int; como la forma de declarar variables, el uso de paréntesis, corchetes y llaves; y en general como las diferencias entre un lenguaje cuya sintaxis es heredada del C y otro cuya sintaxis es heredada del BASIC. Por otra parte también existen diferencias un poco más significativas tales como el chequeo de desbordamientos, el paso de parámetros y la vinculación tardía, puntos que son manejados de manera un poco diferente por ambos lenguajes; además VB .NET incluye, por facilidad y compatibilidad, un conjunto de funciones preconstruidas tales como: LEN, MID, CInt, IsDate, etc., y permite el uso de un manejo de errores estructurado; y por compatibilidad permite también el manejo de errores no estructurado.

¿Y el soporte?

He escuchado mucho decir que hay más ejemplos en C# que en Visual Basic.NET; que la mayoría del código escrito hasta ahora en .NET está en C#; que existen más y mejores tutoriales en la Web, y esto es algo que no puedo negar ni afirmar, sin embargo pienso que el grueso de los desarrolladores de Visual Basic, aún no han hecho la transición desde el Visual Basic 6 hacia el Visual Basic .NET, a diferencia de los desarrolladores de C y C++, quienes en su necesidad de poder utilizar una herramienta RAD que les permita aminorar los tiempos de desarrollo, han hecho esta transición lo antes posible.

¿Cómo decido?

Si ya has decidido utilizar .NET como plataforma de desarrollo, creo que el enfoque principal debe centrarse en aprender los aspectos del funcionamiento del .NET Framework, y la decisión acerca de cuál lenguaje a utilizar dependerá más de tu experiencia previa con otros lenguajes tales como el C, el C++ ó el Visual Basic, ya que la curva de aprendizaje será mucho menor si eres un desarrollador con experiencia en C y decides utilizar C#; de igual manera, si eres un desarrollador con experiencia en Visual Basic, esta curva de aprendizaje será menor si eliges Visual Basic .NET, ya que esto permite centrarse en aprender los aspectos nuevos y específicos del .NET Framework y no centrarse en aprender aspectos específicos del lenguaje tales como su sintaxis, por ejemplo. Esto no quiere decir que debamos cerrarnos a un solo lenguaje, sino que es más fácil aprender esta plataforma haciendo uso de un lenguaje con el que ya estás familiarizado.

Conclusión

Ya que ambos lenguajes están basados en la misma plataforma (.NET), y hacen uso de los mismos recursos (.NET Framework), podemos obtener los mismos resultados con uno y otro; lo que nos da la libertad de seleccionar el lenguaje que más se acomode a nuestras necesidades y experiencia previa sin sacrificar la potencia o la funcionalidad que el lenguaje nos ofrece, permitiéndonos esto centrarnos más en aprender los aspectos nuevos de la plataforma, que a fin de cuentas son comunes a todos los lenguajes.

Esto no quiere decir que debamos quedarnos con un solo lenguaje; al contrario, una vez que hayamos dominado uno, debemos empezar a aprender otro nuevo, ya que las condiciones en las que desarrollamos aplicaciones no siempre será las mismas pero eso sí, siempre hay que estar preparado.

Mario Félix Guerrero es Licenciado en Sistemas de Información del Instituto Tecnológico de Sonora, Cd. Obregón Sonora, México. Posee experiencia laboral mayormente en el Departamento de Tecnologías y Servicios de Información de ese instituto, desarrollando principalmente aplicaciones de escritorio y aplicaciones Web con herramientas tales como Visual Basic 6.0, ASP y SQL Server 2000; ha desarrollado aplicaciones para dispositivos móviles y aplicaciones Web con ASP .net. Ha obtenido la 3ra. Estrella del programa Desarrollador Cinco Estrellas de Microsoft MSDN y es Instructor de esa estrella.

 

Fuente: http://msdn.microsoft.com/es-es/library/bb972208.aspx

Ejemplo de como usar un ListView con C# y SQL Server 2008

Aquí les dejo un sencillo ejemplo de como usar un ListView Descargar

Recorrer objetos contenidos en un groupBox

Hola en este ejemplo muestro una manera de como recorrer objetos contenidos en un groupBox, básicamente lo que hago es recorrer los objetos preguntado si son textBox y si su contenido es vacío le asigne a una variable un mensaje el cual se retorna al final de la función, del mismo modo preguntado si son comboBox y si su contenido es vacío le asigne a una variable un mensaje el cual se retorna al final de la función.

public String ValidarEntradas(GroupBox group)
       {
           String mensaje = “”;

           foreach (Object obj in group.Controls)
           {
               //TextBox
               if (obj is TextBox &&  ((TextBox)obj).Text==”»)
               {
                   mensaje = “Campo “+((TextBox)obj).Tag + ” es requerido “;
                   ((TextBox)obj).Focus();
               }

               //ComboBox
               if (obj is ComboBox && ((ComboBox)obj).Text == “”)
               {
                   mensaje = “Campo ” + ((ComboBox)obj).Tag + ” es requerido “;
                   ((ComboBox)obj).Focus();
               }
           }
           return mensaje;
       }

Función para almacenar los datos de un objeto SqlDataReader en un ArrayList

Función para almacenar los datos de un objeto SqlDataReader en un ArrayList

public ArrayList CargarDatos(String sql)
{
//Nota: oLector es una instancia de SqlDataReader, que debes declarar al inicio de la //clase, tambien debes tener una conexión establecida con el servidor, oConexión //seria la instancia
SqlCommand oComando = new SqlCommand(sql, oConexion);
oLector = oComando.ExecuteReader();
ArrayList datos = new ArrayList();
while(oLector.Read())
{
for (int indice=0; indice < oLector.FieldCount; indice++)
{
datos.Add(oLector[indice].ToString());
}
}
oLector.Close();
oLector.Dispose();
return datos;
}