20 de febrero de 2009

Desarrollo Web: De VB a C# y volver a empezar

Los que llevamos tiempo en el mundo del desarrollo de páginas Web tuvimos con Microsoft una gran ayuda gracias a su innovadora tecnología, para su tiempo, las Active Server Pages ó ASP. Como lenguajes para utilizar la potencialidad de las páginas asp tenemos el Visual Basic Script (VBScript), JScript (con el que desarrollé un portal de empleo), PerlScript o Phyton.

Con el nacimiento de la tecnología .NET, los posibles lenguajes de programación han aumentado notablemente, desde COBOL.Net pasando por Perl.Net y cosas más raras como el novedoso CAML.NET (que utilizo en una aplicación que mantengo actualmente para un organismo del Ministerio de Cultura español) y el nuevo C#, que es un lenguaje estilo Java y nuestros clásicos VB.NET y JScript.NET.

El lenguaje más utilizado en la época de las páginas ASP fue el VBScript. Casi todos los ejemplos que se pueden encontrar en la Web para páginas ASP se encuentran en este lenguaje de programación (aunque hay algunos pocos ejemplos en JScript también). Con la evolución a .NET le ha nacido al Visual Basic.NET un gran competidor: el nuevo C#. Este lenguaje tiene una sintaxis muy parecida a Java, por lo que los nuevos desarrolladores de páginas Web en tecnologías Microsoft estan prefiriendo este nuevo lenguaje, a juzgar por la gran cantidad de ejemplos repartidos en la Web en este nuevo lenguaje.

En este artículo intentaré explicar las principales diferencias, a nivel de sintaxis, que existen entre el VBScript de toda la vida (y VB.NET) y el nuevo C# para que aquellos programadores de experiencia puedan tener más facil la migración a la tecnología .NET. Este artículo también les puede servir a aquellos que empezaron en Java y que al ver el código en VBScript ó VB.NET se queden con cara de tontos al ver muchas cosas que podrían pensar que son "locuras Microsoft"

Como un comentario adicional, he de reconocer que aquellos programadores más antiguo que se han utilizado el JScript podrán migrar a C# de forma más facil debido a que la sintaxis de ambos lenguajes provienen de Java (bueno, el JScript proviene del Javascript, pero considerando que el Javascript tiene una sintaxis que proviene del Java, pues asumimos que provienen del Java para simplificar).

Aspecto Fundamental: Comprendiendo el Framework .NET
Recordar que antes de. NET, las aplicaciones de Windows utilizan la API de Win32, una amplia colección de funciones que interactúan con el sistema operativo para proporcionar todo tipo de tareas (el tema gráfico, información de hardware o la manipulación, y otros sistemas operativos a nivel de tareas). Entonces, ¿cómo hace uno. Intereact NET con el sistema operativo? Afortunadamente, la API de Win32 es una cosa del pasado;. NET utilizar el. NET Framework, una gran colección organizada de las clases para permitir que toda la funcionalidad que un desarrollador necesita.

A diferencia de la API de Win32,. NET Framework clases están muy bien organizados en un sistema jerárquico de nombres. Cada nombre puede contener un número ilimitado de clases. Por ejemplo, la base de nombres System contiene las clases que se utilizan para los tipos de datos primitivos: System.Int32 System.Array System.String etc Espacio de nombres System.Data contiene las clases y nombres relacionados con el acceso a los datos, el System.IO nombres System.IO contiene clases para la manipulación y archivo general de entrada / salida. Hay literalmente cientos de clases de. NET Framework, todos muy bien organizados por nombres. De hecho, usted puede crear fácilmente sus propias clases y para el uso de nombres en el archivo. NET.

Observe que el. NET Framework contienen una clase para cada tipo de datos primitivos en el System de nombres. . NET lenguajes de programación (como VB.NET, C #, JScript.NET, etc) debe utilizar estos tipos de datos, lo que significa que cada tipo de datos es, en esencia, una clase. Por lo tanto, cuando usted haga lo siguiente:

En VB y VB.NET : Dim i as Integer
En C# : int i;
En JScript.NET : var i;

En los 3 casos, siempre se ha creado una instancia de una clase, System.Int32 del Framework de .NET. Dado que cada lenguaje de programación que usa los mismos tipos de datos y las obras de un mismo conjunto de clases, se garantiza la interoperatibilidad (espero haber escrito bien el palabrejo) entre las lenguas. Hay una razón que se llama el CLR Common Language Runtime - cada lenguaje de programación termina produciendo MSIL, que está garantizado para uso acordado tipos de datos y trabajar con clases de. NET Framework.

Primera Diferencia: El Case Sensitive
En VBScript y VB.NET veiamos en los manuales que los objetos tenían una nomenclatura que diferenciaba las mayúsculas y minúsculas de las instrucciones (por ejemplo el clásico Response.Write("Hola Mundo"), pero en VB podíamos escribirlo como queríamos y siempre nos funcionaba:

response.write("Hola Mundo")
Response.write("Hola Mundo")
Response.Write("Hola Mundo")

Esto en C# no es posible dado que es un lenguaje que diferencia las mayúsculas de las minúsculas, incluso para el nombre de las variables!!! y ya sabes, que si no escribes las cosas bien al final te salta un pedazo de error impresionante.

Segunda Diferencia: Delimitadores de instrucciones - El ";" del C#
Tenga en cuenta el punto y coma al final de cada instrucción en el C # (con lo que puede haber más de 1 instrucción por línea de código, aspecto no recomendable pero posible). En VB.NET, cada instrucción es delimitada por una retorno de carro, lo que significa, en esencia, que cada línea de código va en su propia línea.

Tercera Diferencia: La Declaración de Variables
En VB se declaran las variables a través de la Dim declaración, en la siguiente sintaxis:

Dim VariableName as Type
en .NET: Dim VariableName as Type [ = value ]
El VariableName es el nombre de la variable y el = value es opcional (es una forma rápida de inicializar una variable en VB.NET) Además, establece que la variable a un valor determinado. Por ejemplo, si queríamos crear un Integer nombre iAge con un valor inicial de 23, que podríamos hacer:

Dim iAge as Integer = 23

En C #, la sintaxis es un poco diferente. Omitimos el Dim declaración del tipo y el lugar antes de la VariableName, así:

Type VariableName [ = value ];
int iAge = 23;

Tenga en cuenta que existen algunas diferencias en el tipo entre los nombres de C # y VB.NET. El Integer de VB se corresponde con el int de C#, el Single de VB con el float de C#, etc.; sin embargo, a pesar de estas pequeñas diferencias en la ortografía de los tipos de datos las equivalencias se corresponden a los mismos tipos de datos especificados en el. NET Framework. Es decir, un VB.NET Integer y un C # int son ambos casos de la System.Int32 NET Framework estructura. De hecho, en lugar de especificar iAge y Integer o int en los ejemplos anteriores, podríamos haber dicho: Int32 iAge = 23; o Dim iAge as Int32 = 23 que habría tenido el mismo efecto que declara que un Integer o int

Cuarta Diferencia: Los Bloques Condicionales
Un bloque condicional es un conjunto de declaraciones agrupadas que se ejecutan si ocurre cierto evento especificado. Como el más común y simple es el "if", lo utilizaré para mostrar las diferencias existentes. Por ejemplo, si usted tiene un If declaración en VB con el siguiente formato:

If booleanValue then
   Sentencia 1
   Sentencia 2
         ...
   Sentencia n
End If

Vemos que en VB el bloque está marcado por el comienzo If la declaración y el cierre de End If. En C #, llaves se utilizan como delimitadores de bloque. Es decir, en C # nuestro if el código sería así:

if (booleanValue)
(
   Sentencia 1
   Sentencia 2
          ...
   Sentencia n
)

Tenga en cuenta que if debe ser en minúsculas, y que no hay then de palabras clave. Asimismo, el booleanValue debe ser rodeado de paréntesis.

En general, en C# las llaves { ... } se utilizan cada vez que un bloque se necesita en C #, como órganos de las funciones, while, for , etc., mientras que en VB los delimitadores de los bloque son más explícitos, como: Function ... End While ... End For ... Next

Quinta Diferencia: Comentarios en el Código Fuente
Mientras que en VB se utiliza el apóstrofe ( ' ) como caracter para indicar que esa línea es un comentario, en C # podemos tener comentarios de sola línea, marcada por // o podemos crear comentarios multilínea utilizando el delimitadores /* y */ . Es decir, entre los delimitadores de todo es considerado un comentario.

Sexta Diferencia: Vectores y Matrices
Las matrices (o arrays) en VB y C # se crean y gestionan un poco diferente. En primer lugar, a un elemento de índice de un array en VB, utilice paréntesis, como en el ejemplo siguiente:

arrayVariable ( index )

En C #, sin embargo, se utilizan corchetes, así:

arrayVariable [ index ]

Al crear matrices en VB.NET, la sintaxis utilizada es, en esencia, la sintaxis utilizada para crear cualquier variable. Si quieres crear un array llamado ages de 0 a n Integer elementos, usted tendría que hacer:

Dim ages(n) as Integer
Una vez más, habra que tener en cuenta que ello crearía un total de n + 1 elementos (0 .. n). 

En C #, la matriz de declaración es un poco diferente:

int[] ages = new int[n];

Ten en cuenta que son los corchetes [] antes del nombre de variable, lo que indica que la ages va a ser una matriz. A continuación, tenemos que asignar n int s diciendo = new int[n] Tenga en cuenta que esto crea un total de n elementos, los elementos indexados de 0 a n - 1! Esto es diferente que en VB.NET, que crea un total de un elemento adicional en comparación con C#.

Séptima Diferencia: Creación de Funciones y Procedimientos
En VB hay dos clases de funciones: las que devuelven valores de retorno y las que no. Las funciones que no devuelven valores se les llama procedimientos o subrutinas, y se crean un poco diferente a quellas funciones que devuelven un valor. En VB, para crear una función, que devuelve un valor, utilice la siguiente sintaxis:

Function FunctionName ( arg1 as Type , ... argN as Type ) as ReturnType
...
Return someVariableOfReturnType
End Function

Tenga en cuenta que al crear una función que debe especificar el tipo de variable que va a devolver la funcion. Entonces, en alguna parte del cuerpo de la función (por lo general al final), debe devolver un valor de la correcta ReturnType. Funciones, por supuesto, puede tener cero a muchos parámetros de entrada, arg1 a través de argN, cada uno con su propio tipo. Una subrutina (o procedimiento, ya que es a veces llamado), se define un poco diferente:

Sub ProcedureName ( arg1 as Type , ... argN as Type )
...
End Sub

En C #, para crear una función o un procedimiento (una función que no devuelve un valor) debe usar la siguiente sintaxis:

ReturnType FunctionName ( Type arg1 , ... Type argN )
{
...
return someVariableOfReturnType
}

En C # si no desea que la función retorne un valor, especifique el ReturnType void. Tenga en cuenta que la función del cuerpo está delimitado por las llaves { ... } y que, al igual que con la función VB, debemos tener el retorno de una variable del tipo adecuado (en las funciones cuyoReturnType es void la sentencia return es necesaria).

Octava Diferencia: Transformaciones entre tipos de Datos
Esencialmente, el proceso de convertir una variable de un tipo a otro (de una cadena a un entero) puede ser de 2 tipos: implícitos y explícitos. Implícito, como su nombre lo indica, sucede automáticamente; explícito significa que deben incluirse sentencias adicionales para especificar que debe producirse una transformación de tipo de datos. VB permite un montón de transofrmaciones entre tipos de datos de forma implícita, mientras que C # requiere que se declaren explicitamente dichas transformaciones. Por ejemplo, si queremos tener un ArrayList de valores y, a continuación trabajar con un determinado valor, tenemos: 

ArrayList ages = new ArrayList();
ages.Add(23);
int x = ages[0]; // ERROR: ages[0] returns an object - need to cast to int

Sin embargo, el código anterior (en la sintaxis de VB por supuesto) no tendrá ningún problema. Para que este ejemplo funcione adecuadamente en C#, simplemente coloque el tipo deseado entre paréntesis ( DesiredType ) en la sección frontal de la variable que tiene el valor que desea transformar. 

ArrayList ages = new ArrayList();
ages.Add(23);
int x = (int) ages[0]; // No error due to explicit cast to int

En VB, la transformación explicita de tipos de datos tiene la sintaxis siguiente:

VariableOfTypeConvertToType = CType( ObjectToCast , ConvertToType )


Al final, he intentado explicar las principales diferencias que existen entre el VB y el C#, los dos principales lenguajes utilizados en el desarrollo de aplicaciones Web en .NET. Cualquier duda podeis dejar un comentario