
Lenguajes de desarrollo para dispositivos móviles
Introducción
¡Hola!
¿Qué tal?, me da gusto que nos volvamos a encontrar en esta tercera sesión, espero que estes disfrutando esta oportunidad de aprendizaje pues te permitirá tener más herramientas para tu éxito personal y profesional.
En esta sesión descubrirás que los lenguajes de desarrollo, son la base de cualquier aplicación; ya sea de escritorio, web o bien, para dispositivos móviles, los lenguajes de programación son la forma en que se darán las instrucciones al dispositivo para que realice las tareas que necesitamos que haga nuestra aplicación.
Existen varios lenguajes de desarrollo, cada uno con una sintaxis y herramienta de desarrollo diferente, no hay uno mejor que otro, todo dependerá del programador, cuál debe de elegir.
En nuestro caso, utilizaremos C# como lenguaje de programación.
Dada la introducción al tema, te invito a comenzar.
Desarrollo del tema
Para dar continuidad al tema te invito a revisar los siguientes materiales:

C# (pronunciado «si sharp» en inglés) es un lenguaje de programación moderno, basado en objetos y con seguridad de tipos. C# permite a los desarrolladores crear muchos tipos de aplicaciones seguras y sólidas que se ejecutan en .NET. C# tiene sus raíces en la familia de lenguajes C, y a los programadores de C, C++, Java y JavaScript les resultará familiar inmediatamente. Este paseo proporciona información general de los principales componentes del lenguaje en C# 8 y versiones anteriores. Si quieres explorar el lenguaje a través de ejemplos interactivos, prueba los tutoriales de introducción a C#.
C# es un lenguaje de programación *orientado a componentes_, orientado a objetos. C# proporciona construcciones de lenguaje para admitir directamente estos conceptos, por lo que se trata de un lenguaje natural en el crear y usar componentes de software. Desde su origen, C# ha agregado características para admitir nuevas cargas de trabajo y prácticas de diseño de software emergentes. En su núcleo, C# es un lenguaje _ *orientado a objetos**. Define los tipos y su comportamiento.
Varias características de C# facilitan la creación de aplicaciones sólidas y duraderas. La *recolección de elementos no utilizados _ reclama de forma automática la memoria ocupada por objetos no utilizados inalcanzables. Los tipos que aceptan valores NULL ofrecen protección ante variables que no hacen referencia a objetos asignados. El control de excepciones proporciona un enfoque estructurado y extensible para la detección y recuperación de errores. Las expresiones lambda admiten técnicas de programación funcional. La sintaxis de Language Integrated Query (LINQ) crea un patrón común para trabajar con datos de cualquier origen. La compatibilidad del lenguaje con las operaciones asincrónicas proporciona la sintaxis para crear sistemas distribuidos. C# tiene un _ *sistema de tipos unificados**. Todos los tipos de C#, incluidos los tipos primitivos como int y double, se heredan de un único tipo object raíz. Todos los tipos comparten un conjunto de operaciones comunes.
Los valores de cualquier tipo se pueden almacenar, transportar y operar de forma coherente. Además, C# admite tanto tipos de referencia definidos por el usuario como tipos de valor. C# permite la asignación dinámica de objetos y el almacenamiento en línea de estructuras ligeras. C# admite métodos y tipos genéricos, que proporcionan una mayor seguridad de tipos, así como un mejor rendimiento. C# también proporciona iteradores, gracias a los que los implementadores de clases de colecciones pueden definir comportamientos personalizados para el código de cliente.
C# resalta el control de versiones para asegurarse de que los programas y las bibliotecas pueden evolucionar con el tiempo de manera compatible. Los aspectos del diseño de C# afectados directamente por las consideraciones de versionamiento incluyen los modificadores virtual y override independientes, las reglas para la resolución de sobrecargas de métodos y la compatibilidad para declaraciones explícitas de miembros de interfaz.
Arquitectura de .NET
Los programas de C# se ejecutan en .NET, un sistema de ejecución virtual denominado Common Language Runtime (CLR) y un conjunto de bibliotecas de clases. CLR es la implementación de Microsoft del estándar internacional Common Language Infrastructure (CLI). CLI es la base para crear entornos de ejecución y desarrollo en los que los lenguajes y las bibliotecas funcionan juntos sin problemas.
El código fuente escrito en C# se compila en un lenguaje intermedio (IL) que guarda conformidad con la especificación de CLI. El código y los recursos de IL, como los mapas de bits y las cadenas, se almacenan en un ensamblado, normalmente con una extensión .dll. Un ensamblado contiene un manifiesto que proporciona información sobre los tipos, la versión y la referencia cultural.
Cuando se ejecuta el programa C#, el ensamblado se carga en CLR. CLR realiza la compilación Just-In-Time (JIT) para convertir el código IL en instrucciones de máquina nativas. Además, CLR proporciona otros servicios relacionados con la recolección de elementos no utilizados, el control de excepciones y la administración de recursos. El código que se ejecuta en CLR a veces se conoce como «código administrado». El «código no administrado» se compila en lenguaje de máquina nativo que tiene como destino una plataforma específica.
La interoperabilidad entre lenguajes es una característica principal de .NET. El código IL generado por el compilador de C# se ajusta a la especificación de tipo común (CTS). El código IL generado desde C# puede interactuar con el código generado a partir de las versiones de .NET de F# , Visual Basic y C++. Hay más de otros 20 lenguajes compatibles con CTS. Un solo ensamblado puede contener varios módulos escritos en diferentes lenguajes .NET y los tipos se pueden hacer referencia mutuamente igual que si estuvieran escritos en el mismo lenguaje.
Además de los servicios en tiempo de ejecución, .NET también incluye amplias bibliotecas, que admiten muchas cargas de trabajo diferentes. Se organizan en espacios de nombres que proporcionan una amplia variedad de funcionalidades útiles. Las bibliotecas incluyen todo, desde la entrada y salida de archivos, la manipulación de cadenas y el análisis de XML hasta los marcos de aplicaciones web y los controles de Windows Forms. En una aplicación de C# típica se usa la biblioteca de clases de .NET de forma extensa para controlar tareas comunes de infraestructura.
El programa «Hola mundo» tradicionalmente se usa para presentar un lenguaje de programación. En este caso, se usa C#:
using System;
class Hello
{
static void Main()
{
Console.WriteLine(«Hello, World»);
}
}
El programa «Hola mundo» empieza con una directiva using que hace referencia al espacio de nombres System. Los espacios de nombres proporcionan un método jerárquico para organizar las bibliotecas y los programas de C#. Los espacios de nombres contienen tipos y otros espacios de nombres; por ejemplo, el espacio de nombres System contiene varios tipos, como la clase Console a la que se hace referencia en el programa, y otros espacios de nombres, como IO y Collections. Una directiva using que hace referencia a un espacio de nombres determinado permite el uso no calificado de los tipos que son miembros de ese espacio de nombres. Debido a la directiva using, puede utilizar el programa Console.WriteLine como abreviatura de System.Console.WriteLine.
La clase Hello declarada por el programa «Hola mundo» tiene un miembro único, el método llamado Main. El método Main se declara con el modificador static. Mientras que los métodos de instancia pueden hacer referencia a una instancia de objeto envolvente determinada utilizando la palabra clave this, los métodos estáticos funcionan sin referencia a un objeto determinado. Por convención, un método estático denominado Main sirve como punto de entrada de un programa de C#.
La salida del programa la genera el método WriteLine de la clase Console en el espacio de nombres System. Esta clase la proporcionan las bibliotecas de clase estándar, a las que, de forma predeterminada, el compilador hace referencia automáticamente.
Tipos y variables
Un tipo define la estructura y el comportamiento de los datos en C#. La declaración de un tipo puede incluir sus miembros, tipo base, interfaces que implementa y operaciones permitidas para ese tipo. Una variable es una etiqueta que hace referencia a una instancia de un tipo específico. Hay dos clases de tipos en C#: tipos de valor y tipos de referencia. Las variables de tipos de valor contienen directamente sus datos. Las variables de tipos de referencia almacenan referencias a los datos, lo que se conoce como objetos. Con los tipos de referencia, es posible que dos variables hagan referencia al mismo objeto y que, por tanto, las operaciones en una variable afecten al objeto al que hace referencia la otra.
Con los tipos de valor, cada variable tiene su propia copia de los datos y no es posible que las operaciones en una variable afecten a la otra (excepto para las variables de parámetro ref y out).
Un identificador es un nombre de variable. Un identificador es una secuencia de caracteres Unicode sin ningún espacio en blanco. Un identificador puede ser una palabra reservada de C# si tiene el prefijo @. El uso de una palabra reservada como identificador puede ser útil al interactuar con otros lenguajes.
Los tipos de valor de C# se dividen en tipos simples, tipos de enumeración, tipos de estructura, tipos de valor que aceptan valores NULL y tipos de valor de tupla. Los tipos de referencia de C# se dividen en tipos de clase, tipos de interfaz, tipos de matriz y tipos delegados.
En el esquema siguiente se ofrece información general del sistema de tipos de C#.
- Tipos de valor
- Tipos simples
- Entero con signo: sbyte, short, int, long
- Entero sin signo: byte, ushort, uint, ulong
- Caracteres Unicode: char, que representa una unidad de código UTF-16
- Punto flotante binario IEEE: float, double
- Punto flotante decimal de alta precisión: decimal
- Booleano: bool, que representa valores booleanos, valores que son true o false
- Tipos de enumeración
- Tipos definidos por el usuario con el formato enum E {…}. Un tipo enum es un tipo distinto con constantes con nombre. Cada tipo enum tiene un tipo subyacente, que debe ser uno de los ocho tipos enteros. El conjunto de valores de un tipo enum es igual que el conjunto de valores del tipo subyacente.
- Tipos de estructura
- Tipos definidos por el usuario con el formato struct S {…}
- Tipos de valores que aceptan valores NULL
- Extensiones de todos los demás tipos de valor con un valor null
- Tipos de valor de tupla
- Tipos definidos por el usuario con el formato (T1, T2, …)
- Tipos de referencia
- Tipos de clase
- Clase base definitiva de todos los demás tipos: object
- Cadenas Unicode: string, que representa una secuencia de unidades de código UTF-16
- Tipos definidos por el usuario con el formato class C {…}
- Tipos de interfaz
- Tipos definidos por el usuario con el formato interface I {…}
- Tipos de matriz
- Unidimensional, multidimensional y escalonada. Por ejemplo, int[], int[,] y int[][].
- Tipos delegados
- Tipos definidos por el usuario con el formato delegate int D(…)
Los programas de C# utilizan declaraciones de tipos para crear nuevos tipos. Una declaración de tipos especifica el nombre y los miembros del nuevo tipo. Seis de las categorías de tipos de C# las define el usuario: tipos de clase, tipos de estructura, tipos de interfaz, tipos de enumeración, tipos de delegado y tipos de valor de tupla. También puede declarar tipos record, bien sean record struct o record class. Los tipos de registro tienen miembros sintetizados por el compilador. Los registros se usan principalmente para almacenar valores, con un comportamiento mínimo asociado.
A tipo class define una estructura de datos que contiene miembros de datos (campos) y miembros de función (métodos, propiedades y otros). Los tipos de clase admiten herencia única y polimorfismo, mecanismos por los que las clases derivadas pueden extender y especializar clases base.
Un tipo struct es similar a un tipo de clase, por el hecho de que representa una estructura con miembros de datos y miembros de función. Pero a diferencia de las clases, las estructuras son tipos de valor y no suelen requerir la asignación del montón. Los tipos de estructura no admiten la herencia especificada por el usuario y todos se heredan implícitamente del tipo object.
Un tipo interface define un contrato como un conjunto con nombre de miembros públicos. Un valor class o struct que implementa interface debe proporcionar implementaciones de miembros de la interfaz. Un interface puede heredar de varias interfaces base, y un class o struct pueden implementar varias interfaces.
Un tipo delegate representa las referencias a métodos con una lista de parámetros determinada y un tipo de valor devuelto. Los delegados permiten tratar métodos como entidades que se puedan asignar a variables y se puedan pasar como parámetros. Los delegados son análogos a los tipos de función proporcionados por los lenguajes funcionales. También son similares al concepto de punteros de función de otros lenguajes. A diferencia de los punteros de función, los delegados están orientados a objetos y tienen seguridad de tipos.
Los tipos class, struct, interface y delegate admiten parámetros genéricos, mediante los que se pueden parametrizar con otros tipos.
C# admite matrices unidimensionales y multidimensionales de cualquier tipo. A diferencia de los tipos enumerados antes, no es necesario declarar los tipos de matriz antes de usarlos. En su lugar, los tipos de matriz se crean mediante un nombre de tipo entre corchetes. Por ejemplo, int[] es una matriz unidimensional de int, int[,] es una matriz bidimensional de int y int[][] es una matriz unidimensional de las matrices unidimensionales, o la matriz «escalonada», de int.
Los tipos que aceptan valores NULL no requieren una definición independiente. Para cada tipo T que no acepta valores NULL, existe un tipo T? que acepta valores NULL correspondiente, que puede tener un valor adicional, null.
Por ejemplo, int? es un tipo que puede contener cualquier entero de 32 bits o el valor null y string? es un tipo que puede contener cualquier string o el valor null.
El sistema de tipos de C# está unificado, de tal forma que un valor de cualquier tipo puede tratarse como object. Todos los tipos de C# directa o indirectamente se derivan del tipo de clase object, y object es la clase base definitiva de todos los tipos. Los valores de tipos de referencia se tratan como objetos mediante la visualización de los valores como tipo object. Los valores de tipos de valor se tratan como objetos mediante la realización de operaciones de conversión boxing y operaciones de conversión unboxing. En el ejemplo siguiente, un valor int se convierte en object y vuelve a int.
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
Cuando se asigna un valor de un tipo de valor a una referencia object, se asigna un «box» para contener el valor. Ese box es una instancia de un tipo de referencia, y es donde se copia el valor. Por el contrario, cuando una referencia object se convierte en un tipo de valor, se comprueba si el elemento object al que se hace referencia es un box del tipo de valor correcto. Si la comprobación se realiza correctamente, el valor del box se copia en el tipo de valor.
El sistema de tipos unificado de C# conlleva efectivamente que los tipos de valor se tratan como referencias object «a petición». Debido a la unificación, las bibliotecas de uso general que utilizan el tipo object pueden usarse con todos los tipos que se derivan de object, como, por ejemplo, los tipos de referencia y los tipos de valor.
Hay varios tipos de variables en C#, entre otras, campos, elementos de matriz, variables locales y parámetros. Las variables representan ubicaciones de almacenamiento. Cada variable tiene un tipo que determina qué valores se pueden almacenar en ella, como se muestra a continuación.
Tipo de valor distinto a NULL
Un valor de ese tipo exacto.
Tipos de valor NULL
Un valor null o un valor de ese tipo exacto
objeto
Una referencia null, una referencia a un objeto de cualquier tipo de referencia o una referencia a un valor de conversión boxing de cualquier tipo de valor.
Tipo de clase
Una referencia null, una referencia a una instancia de ese tipo de clase o una referencia a una instancia de una clase derivada de ese tipo de clase.
Tipo de interfaz
Un referencia null, una referencia a una instancia de un tipo de clase que implementa dicho tipo de interfaz o una referencia a un valor de conversión boxing de un tipo de valor que implementa dicho tipo de interfaz.
Tipo de matriz
Una referencia null, una referencia a una instancia de ese tipo de matriz o una referencia a una instancia de un tipo de matriz compatible.
Tipo delegado
Una referencia null o una referencia a una instancia de un tipo delegado compatible.
Conclusión
En síntesis, C# nos permitirá desarrollar la funcionalidad de nuestra aplicación, así como la interfaz gráfica que vamos a utilizar. C# Es un lenguaje flexible de alto nivel, con el cual a través de sentencias muy parecidas al lenguaje humano, podemos llevar a cabo la programación.
Llegamos al final de la tercera clase. ¡Felicidades, estás avanzando muy bien! Espero que el tema te haya gustado y despierte tu interés para seguir investigando sobre ello. Recuerda elaborar y mandar la consigna asignada a esta clase, te espero en la cuarta sesión donde aprenderás un tema relevante para tu formación académica.
Fuentes de información
- C#. Microsoft Docs. C# docs – get started, tutorials, reference. | Microsoft Docs