Fundamentos de C#: Tipos de datos y control de flujo

En este artículo, exploraremos los fundamentos de C#, incluyendo los tipos de datos, el control de flujo y las diferencias entre .NET Framework, .NET Core y .NET Moderno. C# es un lenguaje de programación moderno y versátil que se utiliza en una amplia variedad de aplicaciones, desde software de escritorio hasta aplicaciones web y móviles.

Autor: José Alvarado
Publicado: hace 3 meses
Fundamentos de C#: Tipos de datos y control de flujo

Introducción al lenguaje

C# es un lenguaje de programación moderno, orientado a objetos, y desarrollado por Microsoft como parte de su plataforma .NET. Fue diseñado para ser simple, eficiente y seguro, inspirado en lenguajes como C++ y Java, pero eliminando características complejas y propensas a errores.

C# es un lenguaje de programación fuertemente tipado, lo que significa que cada variable y cada expresión tiene un tipo de datos asociado. Esto permite al compilador detectar errores en tiempo de compilación, y proporciona una mayor seguridad y rendimiento en tiempo de ejecución.

El objetivo de C# es permitir a los desarrolladores construir una amplia gama de aplicaciones, desde software de escritorio hasta aplicaciones web, móviles y de inteligencia artificial. Gracias a su versatilidad y constante evolución, es un pilar en el desarrollo empresarial y de plataformas en la nube.

¿Qué es .NET?

.NET es una plataforma de desarrollo de software creada por Microsoft que permite construir una amplia variedad de aplicaciones, como aplicaciones web, de escritorio, móviles, juegos y servicios en la nube. Es multiplataforma, lo que significa que se puede utilizar en sistemas operativos como Windows, macOS y Linux.

.NET está compuesta por:

  • Lenguajes de programación: C# es el lenguaje principal, pero .NET también admite otros lenguajes como F# (funcional) y Visual Basic (orientado a eventos).
  • Common Language Runtime (CLR): Es el entorno de ejecución que gestiona la ejecución del código, la memoria, manejo de excepciones y seguridad.
  • Bibliotecas de clases base (Base Class Library, BCL): Es una colección de clases reutilizables que proporcionan funcionalidades comunes para el desarrollo de aplicaciones.

Diferencias entre .NET Framework, .NET Core y .NET Moderno

  • .NET Framework: Es la versión original de .NET, diseñada para ejecutarse solo en Windows. Aunque sigue siendo utilizado en aplicaciones heredadas, ha sido reemplazado progresivamente por .NET moderno.

  • .NET Core: Es una versión multiplataforma y de código abierto de .NET, diseñada para ejecutarse en Windows, macOS y Linux. Fue la base de .NET 5 y versiones posteriores.

  • .NET Moderno: Es el nombre que se le da a las versiones más recientes de .NET. A partir de .NET 5, Microsoft unificó .NET Framework y .NET Core en una plataforma única y más eficiente. Ofrece mejor rendimiento, compatibilidad multiplataforma y soporte para la última tecnología.

Tipos de datos en C#

En C#, los tipos de datos se dividen en dos categorías principales: tipos de valor y tipos de referencia.

Tipos de valor

Los tipos de valor almacenan sus valores directamente en la memoria y generalmente se asignan en la pila (stack). Cada variable tiene su propia copia de los datos. Algunos ejemplos de tipos de valor incluyen:

  • Tipos numéricos enteros: int, long, short, byte, sbyte, uint, ulong, ushort.
  • Tipos numéricos de punto flotante: float, double, decimal, utilizado para cálculos financieros debido a su alta precisión.
  • Tipos lógicos: bool, almacena true o false.
  • Tipos de caracteres: char, almacena un solo carácter Unicode.
  • Estructuras: struct, tipos de valor personalizados.
  • Enumeraciones: enum, conjunto de constantes simbólicas.

Tipos de referencia

Los tipos de referencia almacenan una referencia (o puntero) a la ubicación de los datos en la memoria, generalmente en el montón (heap). Las variables de tipo de referencia comparten el acceso a los mismos datos en memoria. Algunos ejemplos de tipos de referencia incluyen:

  • Clases: Definidas con la palabra clave class, las clases son tipos de referencia que pueden contener datos y métodos.
  • Interfaces: Definidas con la palabra clave interface, las interfaces son tipos de referencia que definen un contrato de métodos y propiedades que se deben implementar.
  • Arreglos: Cualquier tipo de arreglo como int[], string[], entre otros. Es un tipo de referencia que almacena una colección de elementos.
  • Cadenas de texto: string, aunque se comporta como un tipo de valor, es un tipo de referencia inmutable que almacena una secuencia de caracteres Unicode.
  • Delegados: delegate, representan un puntero a un método y se utilizan para implementar la programación orientada a eventos.
  • dinámicos: dynamic, permite la evaluación de tipo en tiempo de ejecución.
  • Objetos: object, es la clase base de todos los tipos de referencia en C#.

Conversión de tipos

En C#, la conversión entre tipos de datos puede realizarse de diferentes maneras:

Conversión implícita

La conversión implícita se produce cuando no hay riesgo de pérdida de información al convertir un tipo de dato a otro. Por ejemplo, convertir un int a un long. Este proceso se realiza automáticamente por el compilador.

int entero = 10;
float flotante = entero; // Conversión implícita de int a float

Conversión explícita

La conversión explícita requiere un operador de conversión, ya que puede haber pérdida de información o riesgo de error. Se realiza envolviendo el tipo objetivo entre paréntesis antes de la variable o valor que se desea convertir.

double numero = 10.5;
int entero = (int)numero; // Conversión explícita de double a int

Métodos de conversión

Algunos tipos en C# incluyen métodos específicos para convertir valores entre diferentes tipos de datos. Estos métodos pueden ser seguros o arrojar excepciones si la conversión falla.

Métodos comunes

  • ToString(): Convierte cualquier tipo a una representación en texto.
  • Parse(): Convierte una cadena en un tipo numérico, como int.Parse("10").
  • TryParse(): Similar a Parse(), pero no arroja una excepción si la conversión falla, en su lugar, devuelve un valor booleano que indica si la conversión fue exitosa.
  • Convert: Es una clase estática que proporciona métodos para convertir entre diferentes tipos de datos.

Variables y constantes

Las variables son espacios de almacenamiento con un tipo de datos específico, mientras que las constantes contienen valores que no cambian.

Declaración y asignación

En C#, las variables se declaran especificando el tipo de datos y el nombre de la variable. La asignación de un valor se realiza con el operador =.

int edad; // Declaración de una variable de tipo entero
edad = 25; // Asignación de un valor a la variable

string nombre = "Juan"; // Declaración y asignación en una sola línea

Modificadores como const y readonly

  • const: Define una constante en tiempo de compilación cuyo valor no puede cambiar. Debe inicializarse en la misma línea donde se declara.
  • readonly: Define un campo cuyo valor solo puede asignarse en tiempo de ejecución o en el constructor de la clase, y no puede cambiarse después.
const double PI = 3.1416; // Declaración de una constante
readonly string fechaActual = DateTime.Now.ToString("dd/MM/yyyy"); // Declaración de un campo de solo lectura

¿Cuándo utilizar readonly?

Se recomienda utilizar readonly en lugar de const cuando el valor de la constante no se conoce en tiempo de compilación, sino en tiempo de ejecución, como en el caso de obtener la fecha actual.

Control de flujo

El control de flujo en C# permite dirigir la ejecución del programa según condiciones específicas.

Condicionales

if, else if, else

La estructura if permite ejecutar un bloque de código si una condición es verdadera. Se puede utilizar else if para evaluar múltiples condiciones y else para ejecutar un bloque si ninguna condición es verdadera.

int edad = 18;

if (edad < 18)
{
    Console.WriteLine("Eres menor de edad");
}
else if (edad == 18)
{
    Console.WriteLine("Tienes 18 años");
}
else
{
    Console.WriteLine("Eres mayor de edad");
}

switch, case, default

La estructura switch permite evaluar una expresión y ejecutar diferentes bloques de código según el valor de la expresión. Se pueden utilizar múltiples case y un bloque default opcional.

int dia = 3;

switch (dia)
{
    case 1:
        Console.WriteLine("Lunes");
        break;
    case 2:
        Console.WriteLine("Martes");
        break;
    case 3:
        Console.WriteLine("Miércoles");
        break;
    default:
        Console.WriteLine("Otro día");
        break;
}

Bucles

for

El bucle for se utiliza para repetir un bloque de código un número específico de veces.

for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}

foreach

El bucle foreach se utiliza para iterar sobre una colección de elementos, como arreglos o listas.

int[] numeros = { 1, 2, 3, 4, 5 };

foreach (int numero in numeros)
{
    Console.WriteLine(numero); // Imprime 1, 2, 3, 4, 5
}

while

El bucle while se utiliza para repetir un bloque de código mientras una condición sea verdadera.

int i = 0;

while (i < 5)
{
    Console.WriteLine(i); // Imprime 0, 1, 2, 3, 4
    i++;
}

do while

El bucle do while es similar al bucle while, pero garantiza que el bloque de código se ejecute al menos una vez antes de evaluar la condición.

int i = 0;

do
{
    Console.WriteLine(i); // Imprime 0
    i++;
} while (i < 0);

break y continue

break

La palabra clave break se utiliza para salir de un bucle o de una instrucción switch de manera inmediata, independientemente de si se ha alcanzado o no la condición de terminación del bucle.

Cuando se ejecuta break dentro de un bucle (for, while, foreach), el flujo de control se interrumpe y el programa sigue ejecutando las instrucciones que están después del bucle.

Ejemplo de uso de break en un bucle for:

for (int i = 0; i < 10; i++)
{
    if (i == 5)
    {
        break; // Sale del bucle cuando i es igual a 5
    }
    Console.WriteLine(i);
}

Salida:

0
1
2
3
4

En este caso, el bucle se interrumpe cuando i es igual a 5, por lo que no se imprimen los números 5, 6, 7, 8 y 9.

continue

La palabra clave continue se utiliza para omitir el resto de las instrucciones de la iteración actual de un bucle y pasar a la siguiente iteración del mismo. A diferencia de break, que sale completamente del bucle, continue solo interrumpe la iteración actual y el bucle continúa con la siguiente.

Cuando se ejecuta continue, el flujo de control salta inmediatamente al inicio del bucle (o a la condición de la siguiente iteración, dependiendo del tipo de bucle), omitiendo cualquier código que esté después del continue en la iteración actual.

Ejemplo de uso de continue en un bucle for:

for (int i = 0; i < 10; i++)
{
    if (i % 2 == 0)  // Si i es par
    {
        continue;  // Salta el resto del código y va a la siguiente iteración
    }
    Console.WriteLine(i);
}

Salida:

1
3
5
7
9

En este caso, cuando i es par, el continue omite la instrucción Console.WriteLine(i) y pasa a la siguiente iteración del bucle, por lo que solo se imprimen los números impares.

Conclusión

En este artículo, hemos explorado los fundamentos de C#, incluyendo los tipos de datos, el control de flujo y las diferencias entre .NET Framework, .NET Core y .NET Moderno. C# es un lenguaje versátil y poderoso que permite a los desarrolladores crear una amplia variedad de aplicaciones, desde software de escritorio hasta aplicaciones web y móviles. Con una sintaxis clara y concisa, C# es una excelente opción para aquellos que buscan un lenguaje moderno y seguro para el desarrollo de software.

¡No te pierdas mi próximo blog! 👨‍💻