csharp

Ecosistema y contexto

  • GameDev
    • Uso de C# en motores como Unity y frameworks de simulación.
    • Integración con gráficos, físicas, scripting y tooling.
  • net
    • Plataforma principal de ejecución (.NET, .NET Core, .NET 6+).
    • CLR, gestión de memoria, JIT, AOT y librerías base.
  • cpp
    • Comparativa frecuente: rendimiento, control de memoria y casos híbridos (interop C++/CLI, P/Invoke).
    • Escenarios donde C# actúa como capa de alto nivel.

Lenguaje C#

  • Tipado estático fuerte con inferencia (var).
  • Programación orientada a objetos: clases, interfaces, herencia, polimorfismo.
  • Programación funcional:
    • Expresiones lambda, LINQ, inmutabilidad parcial.
    • Delegados, Func<>, Action<>, Predicate<>.
  • Programación asíncrona:
    • async/await, Task, ValueTask.
    • Paralelismo con Parallel, TPL y async streams.
  • Gestión de memoria:
    • Garbage Collector, generaciones, LOH.
    • IDisposable, using, patrones de liberación.
  • Seguridad y robustez:
    • Manejo de excepciones.
    • Tipos nullable, Span<T>, ReadOnlySpan<T>.

Plataforma .NET

  • Runtime:
    • CLR, ejecución administrada y optimizaciones.
    • JIT vs AOT.
  • Librerías:
    • BCL, System.*, colecciones, IO, networking.
  • Compatibilidad:
    • Multiplataforma (Windows, Linux, macOS).
    • Contenedores y despliegue cloud.

Arquitectura y patrones

  • Principios SOLID:
    • Single Responsibility, Open/Closed, Liskov, Interface Segregation, Dependency Inversion.
  • Inyección de dependencias:
    • IServiceCollection, ServiceProvider.
    • Ciclos de vida: transient, scoped, singleton.
  • Patrones de diseño comunes:
    • Factory, Singleton, Adapter, Decorator.
    • Repository y Unit of Work.
  • Patron Strategy

Desarrollo de aplicaciones

  • Consola y utilidades CLI.
  • Aplicaciones de escritorio:
    • WPF, WinForms, MAUI.
  • Web y APIs:
    • ASP.NET Core, Minimal APIs, MVC.
    • Middleware, filtros, autenticación y autorización.
  • Servicios:
    • Background services, workers, microservicios.
  • Integración:
    • REST, gRPC, mensajería (RabbitMQ, Kafka).

Testing y calidad

  • Pruebas unitarias:
    • xUnit, NUnit, MSTest.
  • Mocking:
    • Moq, NSubstitute.
  • Pruebas de integración:
    • WebApplicationFactory, TestContainers.
  • Calidad de código:
    • Analyzers, StyleCop, Sonar.
    • Refactoring continuo.

Herramientas

  • CLI:
    • dotnet new, dotnet build, dotnet test, dotnet publish.
  • IDE:
    • Visual Studio, Visual Studio Code.
  • Control de versiones:
    • Git, flujos de trabajo CI/CD.
  • Observabilidad:
    • Logging (Serilog, NLog).
    • Métricas y tracing.

Libros

  • C-Sharp-10 Net6 Libro
    • Características modernas del lenguaje y runtime.

      C-sharp-visual studio-sdk-componentes

  • Runtimes .NET
    • .NET 5 Runtime
      • Runtime unificado posterior a .NET Core.
      • Uso en aplicaciones legacy recientes y transición hacia .NET 6+.
    • .NET Core 3.1 Runtime (LTS)
      • Versión de soporte extendido ampliamente usada en producción.
      • Base de muchas aplicaciones empresariales existentes.
  • SDK y .NET Framework
    • .NET Framework 4.7.2
    • .NET Framework 4.7.1
    • .NET Framework 4.7
    • .NET Framework 4.6.2
    • .NET Framework 4.6.1
      • Necesarios para mantenimiento de aplicaciones WinForms/WPF clásicas.
      • Compatibilidad con librerías antiguas y sistemas heredados.
  • Windows SDK
    • Windows 10 SDK
      • Versión 10.0.20
      • Versión 10.0.18
      • APIs Win32, UWP, acceso a sistema, drivers y tooling nativo.
    • Windows 11 SDK
      • Versión 10.0.22
      • Soporte para características modernas del sistema operativo.
  • Integración con Visual Studio
    • Compiladores Roslyn y análisis estático.
    • Debugger administrado y mixto (managed/unmanaged).
    • Herramientas de profiling, diagnósticos y testing.
    • Extensibilidad mediante el SDK de Visual Studio.

C-sharp-comandos

  • Creación de proyectos
    • dotnet new console
      • Genera un proyecto de consola con la versión por defecto del SDK.
    • dotnet new console -f net6.0
      • Crea un proyecto apuntando explícitamente a .NET 6.
    • dotnet new classlib
      • Crea una librería de clases reutilizable.
    • dotnet new xunit
      • Inicializa un proyecto de pruebas unitarias con xUnit.
  • Ejecución y configuración
    • dotnet run
      • Compila y ejecuta el proyecto activo.
    • dotnet run --configuration Release
      • Ejecuta usando configuración optimizada para producción.
    • dotnet run --configuration Debug
      • Ejecuta con símbolos de depuración.
  • Paso de argumentos
    • dotnet run firstarg second-arg third:arg "fourth arg"
      • Demuestra cómo se reciben argumentos desde línea de comandos.
    • dotnet run red yellow 50
      • Uso típico para pruebas de lógica basada en parámetros.
  • Ayuda y exploración
    • dotnet help new
      • Muestra documentación general del comando new.
    • dotnet new console -h
      • Ayuda específica para la plantilla console.
  • Gestión de dependencias
    • dotnet add package
      • Añade paquetes NuGet al proyecto.
    • dotnet add reference
      • Agrega referencia a otro proyecto dentro de la solución.
  • Compilación
    • dotnet build
      • Compila el proyecto sin ejecutarlo.
      • Útil en pipelines CI/CD.
  • Convenciones y ejemplos
    • dev_1
      • Identificador de entorno o perfil de desarrollo.
    • desarrollador1
      • Ejemplo de usuario o configuración local para pruebas.

curso-C-NET Tutorial Hello World in 5 minutes

CLI dotnet — visión general

  • Herramienta principal para crear, compilar y ejecutar aplicaciones .NET.
  • Funciona de forma multiplataforma (Windows, Linux, macOS).
  • Centraliza gestión de SDKs, runtimes y plantillas de proyecto.

CLI dotnet — uso básico

Comando dotnet

Usage: dotnet [options]
Usage: dotnet [path-to-application]

Options:
-h|--help         Display help.
--info            Display .NET information.
--list-sdks       Display the installed SDKs.
--list-runtimes   Display the installed runtimes.

path-to-application:
The path to an application .dll file to execute.

`

  • --info
    • Muestra información detallada del entorno .NET.
    • Útil para diagnóstico y soporte.
  • --list-sdks
    • Enumera los SDKs instalados en el sistema.
  • --list-runtimes
    • Lista los runtimes disponibles para ejecución.

Crear tu primera aplicación

Creación del proyecto

dotnet new console -o MyApp
cd MyApp
  • dotnet new console
    • Crea una aplicación de consola usando la plantilla estándar.
  • -o MyApp
    • Genera un directorio llamado MyApp.
    • Inicializa los archivos necesarios del proyecto.
  • cd MyApp
    • Cambia el directorio de trabajo al proyecto recién creado.

Estructura del proyecto

  • Carpeta MyApp
    • MyApp.csproj
      • Archivo de proyecto.
      • Define el framework objetivo, dependencias y configuración.
    • Program.cs
      • Punto de entrada de la aplicación.
      • Contiene el método principal implícito (top-level statements).

Código inicial

Program.cs — Hello World

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
  • Uso de top-level statements.
  • No es necesario definir explícitamente Main.
  • Ideal para ejemplos rápidos y scripts.

Ejecutar la aplicación

Ejecución básica

dotnet run
  • Compila el proyecto si es necesario.
  • Ejecuta el binario resultante.
  • Usa la configuración Debug por defecto.

Edición del código

Program.cs — versión extendida

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Console.WriteLine("The current time is " + DateTime.Now);
  • Introduce el uso de la clase DateTime.
  • Ejemplo de concatenación de strings.
  • Demuestra ejecución secuencial de instrucciones.

Errores comunes y soluciones

  • Error de permisos:
    • Mensaje típico:
      • Template "Console Application" could not be created. Access to the path 'C:\Windows\System32\MyApp' is denied.
    • Solución:
      • Cambiar a un directorio con permisos de escritura.
      • Ejemplo: Documents, Desktop o una carpeta de trabajo.
  • SDK no encontrado:
  • Diagnóstico adicional:
    • Ejecutar dotnet --info.
    • Verificar --list-sdks y --list-runtimes.

c sharp curso intro

Recursos del curso

Temario cubierto

  • Hola mundo
  • Tipos de datos
  • Arrays
  • Funciones y eventos
  • Windows Forms Apps
  • Control de flujo (if, while, do while, for)

Fundamentos del lenguaje

  • Tipado fuerte
    • Cada variable tiene un tipo definido explícitamente.
    • El tipo se asigna en el momento de la creación y no puede cambiar.
  • Inferencia limitada
    • Aunque se use inferencia (var), el tipo queda fijado en la primera asignación.
  • Compilación
    • Los errores de tipo se detectan antes de ejecutar el programa.

Windows Forms Apps

  • Modelo de programación orientado a eventos.
  • El flujo de ejecución depende de acciones del usuario.
  • Componentes comunes:
    • Button → ejecuta código al hacer click.
    • Label → muestra información.
    • TextBox → entrada de datos del usuario.
  • Los métodos como button1_Click son manejadores de eventos.

Ejemplo: variables string y concatenación

Código — strings y Label

private void button1_Click(object sender, EventArgs e)
{
	string prueba = "Prueba de variable";
	string prueba2 = "Prueba " + "de " + "concatenacion " + prueba;
	prueba2 = "otra cosa";
	label1.Text = prueba2;
}

`

  • El operador + concatena cadenas.
  • Las variables pueden reasignarse cuantas veces sea necesario.
  • El texto del Label se actualiza dinámicamente.

Ejemplo: tipos numéricos

Código — int y double

private void button1_Click(object sender, EventArgs e)
{
	int numero = 123;
	double numeroDecimal = 5000.28;

	string prueba = "Prueba de variable: " + numeroDecimal;
	label1.Text = prueba;
}
  • int almacena números enteros.
  • double almacena números decimales con mayor precisión.
  • Al concatenar con un string, el número se convierte automáticamente a texto.

Operador resto (%)

  • Devuelve el resto de una división entera.
  • Uso típico:
    • x % 2 == 0 → número par.
    • x % 5 == 0 → múltiplo de 5.
  • Muy usado en validaciones y control de flujo.

Errores comunes con tipos numéricos

  • Desbordamiento (overflow):
    • byte solo admite valores entre 0 y 255.
    • Si se suma más allá del límite, el valor vuelve a empezar desde 0.
  • Subdesbordamiento:
    • Tipos como short vuelven al valor máximo al restar por debajo del mínimo.
  • Estos errores pueden pasar desapercibidos si no se validan los rangos.

Suma y concatenación

  • Regla clave:
    • Si el primer operando es texto, toda la expresión se evalúa como texto.
  • El orden de los operandos afecta al resultado.
  • Ejemplo conceptual:
    • "Resultado: " + 5 + 5"Resultado: 55"
    • 5 + 5 + " Resultado""10 Resultado"

Booleanos y condicionales

  • El tipo bool solo admite:
    • true
    • false
  • Se obtiene a partir de expresiones lógicas.
  • Muy usado en estructuras if.

Código — if simple

private void button1_Click(object sender, EventArgs e)
{
	int edad = 17;
	bool esMayorDeEdad = edad >= 18;

	label1.Text = "El usuario es menor de edad";
	if (esMayorDeEdad)
	{
		label1.Text = "El usuario es mayor de edad";
	}
}
  • El if ejecuta el bloque solo si la condición es verdadera.

Código — if / else

private void button1_Click(object sender, EventArgs e)
{
	int edad = 17;
	bool esMayorDeEdad = edad >= 18;

	if (esMayorDeEdad)
	{
		label1.Text = "El usuario es mayor de edad";
	}
	else
	{
		label1.Text = "El usuario es menor de edad";
	}
}
  • El else cubre el caso contrario.
  • Evita duplicar lógica innecesaria.

Formularios — renombrar controles

  • Buenas prácticas de nombres:
    • label1lblResultado
    • textBox1txtEdad
  • Ventajas:
    • Código más legible.
    • Menos errores al mantener formularios grandes.
    • El diseñador de Visual Studio actualiza el código automáticamente.

Conversión de texto a número

  • Todo lo que viene de un TextBox es string.
  • Es obligatorio convertir antes de operar con números.

Código — Parse de string a int

private void button1_Click(object sender, EventArgs e)
{
	string textoEdad = txtEdad.Text;
	int edad = Int32.Parse(textoEdad);
	bool esMayorDeEdad = edad >= 18;

	if (esMayorDeEdad)
	{
		lblResultado.Text = "El usuario es mayor de edad";
	}
	else
	{
		lblResultado.Text = "El usuario es menor de edad";
	}
}
  • Riesgo:
    • Si el texto no es numérico, el programa falla.
  • Alternativa recomendada:
    • Int32.TryParse para validar sin excepciones.

Comentarios

  • Comentarios de línea:
    • // comentario
  • Comentarios de bloque:
    • /* comentario */
  • No afectan a la ejecución del programa.
  • Útiles para documentación y mantenimiento.

Calculadora de Índice de Masa Corporal (IMC)

Código — cálculo IMC

private void button1_Click(object sender, EventArgs e)
{
	string textoPeso = txtPeso.Text;
	double peso = Double.Parse(textoPeso);

	string textoAltura = txtAltura.Text;
	double altura = Double.Parse(textoAltura);

	double imc = peso / (altura * altura);
	MessageBox.Show("El imc es " + imc);
}
  • Ejemplo completo de:
    • Entrada de datos.
    • Conversión de tipos.
    • Operaciones matemáticas.
    • Salida visual.

Arrays y errores típicos

  • Un array tiene tamaño fijo.
  • Las posiciones empiezan en 0.
  • Error común:
    • Acceder a un índice fuera del rango.
  • Consecuencia:
    • Excepción en tiempo de ejecución.

Bucle while

  • Evalúa la condición antes de ejecutar el bloque.
  • Si la condición es falsa al inicio, no se ejecuta.
  • Requiere siempre una condición booleana.
  • Error común:
    • while (true) sin ruptura → bucle infinito.

Bucle do while

  • Ejecuta el código antes de comprobar la condición.
  • Garantiza al menos una ejecución.
  • Útil cuando la lógica debe ejecutarse una vez como mínimo.

Bucle for

  • Pensado para contadores.
  • Ideal cuando se conoce el número de repeticiones.
  • Estructura:
    • Inicialización.
    • Condición.
    • Incremento.

Código — for con List

private void button1_Click(object sender, EventArgs e)
{
	List<int> lista = new List<int>();
	lista.Add(2);
	lista.Add(20);
	lista.Add(15);
	lista.Add(100);

	for (int i = 0; i < lista.Count; i++)
	{
		int numero = lista[i];
		MessageBox.Show("El numero es: " + numero);
	}
}
  • List<T> es dinámica.
  • Permite añadir y quitar elementos en tiempo de ejecución.

Código — array estático

int[] listaDeItems = new int[] { 1, 2, 3, 4, 5 };
  • Tamaño fijo.
  • Más simple, pero menos flexible que List<T>.

    c sharp Arrays multidimensionales

Arrays multidimensionales

  • Array bidimensional
    • Estructura en filas y columnas.
    • Conceptualmente es una tabla.
    • Ejemplo típico:
      • Archivo Excel (filas x columnas).
      • Escenario isométrico en videojuegos usando coordenadas x, y.
  • Array multidimensional
    • Arrays anidados en más de dos dimensiones.
    • Permite modelar espacios complejos.
    • Ejemplo:
      • Minecraft usando coordenadas x, y, z para mundo 3D.
  • Casos de uso comunes
    • Mapas, tableros y grids.
    • Simulaciones espaciales.
    • Representación de datos jerárquicos.

Funciones y requerimientos de proyecto

  • Objetivo típico:
    • Aplicar un descuento a un precio.
    • Mostrar el precio final al usuario.
  • Concepto matemático:
    • Regla de tres simple.
    • Ejemplo:
      • Precio: 40 → x
      • Porcentaje: 100% → 20%
      • El descuento se calcula proporcionalmente.

Reutilización de funciones

  • Ventajas
    • Evita duplicar código.
    • Facilita mantenimiento y pruebas.
    • Permite dividir la lógica en responsabilidades claras.
  • Tipo de retorno
    • Define el dato que la función devuelve.
    • Puede reutilizarse en otros métodos.
  • Modificadores
    • private
      • Solo accesible dentro de la clase.
    • public
      • Accesible desde otras clases.

Función sin retorno (void)

Código — mostrar listado

private void button1_Click(object sender, EventArgs e)
{
	int[] listaDeItems = new int[] { 1, 2, 3, 4, 5 };

	List<int> lista = new List<int>();
	lista.Add(2);
	lista.Add(20);
	lista.Add(15);
	lista.Add(100);

	mostrarListado(lista);
}

private void mostrarListado(List<int> lista)
{
	for (int i = 0; i < lista.Count; i++)
	{
		int numero = lista[i];
		MessageBox.Show("El numero es: " + numero);
	}
}

`

  • La función recibe datos como parámetro.
  • No devuelve información.
  • Se utiliza solo para ejecutar una acción.

Función con retorno

Código — devolver listado cargado

private void button1_Click(object sender, EventArgs e)
{
	List<int> lista = traerListado();
	mostrarListado(lista);
}

private List<int> traerListado()
{
	List<int> lista = new List<int>();
	lista.Add(2);
	lista.Add(20);
	lista.Add(15);
	lista.Add(100);
	return lista;
}

private void mostrarListado(List<int> lista)
{
	for (int i = 0; i < lista.Count; i++)
	{
		int numero = lista[i];
		MessageBox.Show("El numero es: " + numero);
	}
}
  • La función crea y devuelve un objeto.
  • Permite separar la carga de datos del procesamiento.
  • El valor retornado puede reutilizarse en múltiples lugares.

Modo Debug y breakpoints

  • Breakpoints
    • Puntos de parada en el código.
    • Permiten detener la ejecución en una línea específica.
  • Uso del debugger
    • Start Debugging o tecla F5.
    • La ejecución se detiene al llegar al breakpoint.
  • Inspección de variables
    • Se pueden ver los valores actuales.
    • Ayuda a detectar errores lógicos.
  • Ejecución paso a paso
    • Step Over
      • Avanza línea por línea sin entrar en funciones.
    • Permite entender el flujo real del programa.

Ejercicio 1 — número mayor y menor

  • Requerimiento
    • Cargar 3 números.
    • Mostrar cuál es el mayor y cuál el menor.
  • Estrategia
    • Tomar el primer número como referencia.
    • Comparar y actualizar.

Código — mayor y menor

private void button2_Click(object sender, EventArgs e)
{
	int numero1 = Int32.Parse(textBox1.Text);
	int numero2 = Int32.Parse(textBox2.Text);
	int numero3 = Int32.Parse(textBox3.Text);

	int mayor = numero1;

	if (numero2 > mayor)
	{
		mayor = numero2;
	}
	if (numero3 > mayor)
	{
		mayor = numero3;
	}

	MessageBox.Show("El numero mayor es " + mayor);

	int menor = numero1;

	if (numero2 < menor)
	{
		menor = numero2;
	}
	if (numero3 < menor)
	{
		menor = numero3;
	}

	MessageBox.Show("El numero menor es " + menor);
}
  • Uso de comparaciones simples.
  • Evita condicionales innecesarios.
  • Código claro y fácil de extender.

Ejercicio 2 — números y promedio

  • Requerimiento
    • Cargar 3 números.
    • Calcular el promedio.
  • Fórmula
    • (n1 + n2 + n3) / 3

Código — promedio básico

int numero1 = Int32.Parse(textBox1.Text);
int numero2 = Int32.Parse(textBox2.Text);
int numero3 = Int32.Parse(textBox3.Text);

double promedio = (numero1 + numero2 + numero3);
promedio = promedio / 3;

MessageBox.Show("El numero promedio " + promedio);

Código — promedio usando casting

double promedio = (Double)(numero1 + numero2 + numero3) / 3;
  • El casting fuerza la conversión a double.
  • Evita la división entera.
  • Permite obtener decimales correctamente.

Ejercicio 3 — número par o impar

  • Requerimiento
    • Ingresar un número.
    • Determinar si es par o impar.
  • Método recomendado
    • Usar el operador resto %.

Código — par o impar con módulo

private void button2_Click(object sender, EventArgs e)
{
	int numero = Int32.Parse(textBox1.Text);

	if (numero % 2 == 0)
	{
		MessageBox.Show("El numero es par");
	}
	else
	{
		MessageBox.Show("El numero es impar");
	}
}
  • Si el resto de dividir entre 2 es 0, el número es par.

Alternativa — comprobación con decimales

  • Idea
    • Dividir entre 2.
    • Comprobar si el resultado es un número entero.
  • Limitación
    • Menos clara y menos eficiente que %.

Código — par o impar con redondeo

private void button2_Click(object sender, EventArgs e)
{
	double numero = Int32.Parse(textBox1.Text);
	double resultado = numero / 2;

	if (resultado == Math.Round(resultado))
	{
		MessageBox.Show("El numero es par");
	}
	else
	{
		MessageBox.Show("El numero es impar");
	}
}
  • Math.Round redondea al entero más cercano.
  • Comparación útil para entender operaciones con decimales.
  • No recomendada frente al uso de %.

    c sharp Ejercicio 4 — Carrito de Compras

  • Objetivo
    • Simular un carrito de compras básico.
    • Permitir agregar productos.
    • Calcular el precio final.
    • Aplicar un 10% de descuento con un código promocional.
  • Productos disponibles
    • Pantalón → $20
    • Camiseta → $35
    • Zapatos → $24
  • Código de promoción
    • NAVIDAD
    • Aplica un 10% de descuento sobre el total.

Ciclo de vida del formulario

  • Evento Form1_Load
    • Se ejecuta una sola vez al cargar el formulario.
    • Ideal para inicializar datos.
    • Se crea haciendo doble click en una zona vacía del diseñador.
  • Usos típicos
    • Cargar combos.
    • Inicializar listas.
    • Preparar valores por defecto.

Cargar productos en el ComboBox

Código — carga inicial del ComboBox

private void Form1_Load(object sender, EventArgs e)
{
	cboProductos.Items.Add("Pantalon");
	cboProductos.Items.Add("Camiseta");
	cboProductos.Items.Add("Zapatos");
}

`

  • Items.Add
    • Añade elementos al ComboBox.
  • Los valores se almacenan como objetos.
  • Visualmente se muestran como texto.

Obtener el producto seleccionado

  • SelectedItem
    • Devuelve un object.
    • Es necesario convertirlo a string.

Conversión correcta

string productoSeleccionado = cboProductos.SelectedItem.ToString();
  • Error común
    • Intentar asignar directamente a string.
  • Solución
    • Usar ToString().

Agregar producto al carrito

Código — botón Agregar

private void btnAgregar_Click(object sender, EventArgs e)
{
	string productoSeleccionado = cboProductos.SelectedItem.ToString();
	listCarritoDeCompras.Items.Add(productoSeleccionado);
}
  • ListBox actúa como carrito.
  • Cada item representa un producto agregado.
  • Se pueden agregar productos repetidos.

Contar productos en el carrito

  • Propiedad:
    • listCarritoDeCompras.Items.Count
  • Uso:
    • Determinar cuántos productos hay.
    • Controlar bucles for.

Recorrer el carrito

Código — recorrido inicial

private void btnCalcular_Click(object sender, EventArgs e)
{
	double precioFinal = 0;

	int totalProductosCargados = listCarritoDeCompras.Items.Count;

	for (int i = 0; i < totalProductosCargados; i++)
	{
		string productoElegido = listCarritoDeCompras.Items[i].ToString();
		MessageBox.Show(productoElegido);
	}
}
  • Se accede a cada elemento por índice.
  • Conversión necesaria a string.
  • Útil para depuración y validación inicial.

Cálculo del precio final

  • Estrategia
    • Recorrer el carrito.
    • Identificar cada producto.
    • Sumar su precio correspondiente.
  • Control mediante condicionales if / else if.

Código de descuento

  • Regla de tres simple
    • Total → 100%
    • Descuento → 10%
  • Aplicación práctica
    • 10% de descuento equivale a multiplicar por 0.9.
  • Ventaja
    • Más simple y legible que operaciones largas.

Cálculo completo con descuento

Código — cálculo del total y promoción

private void btnCalcular_Click(object sender, EventArgs e)
{
	// pantalon 20 $ camiseta 35 zapatos 24
	double precioFinal = 0;

	int totalProductosCargados = listCarritoDeCompras.Items.Count;

	for (int i = 0; i < totalProductosCargados; i++)
	{
		string productoElegido = listCarritoDeCompras.Items[i].ToString();

		if (productoElegido == "Pantalon")
		{
			precioFinal += 20;
		}
		else if (productoElegido == "Camiseta")
		{
			precioFinal += 35;
		}
		else if (productoElegido == "Zapatos")
		{
			precioFinal += 24;
		}
	}

	if (txtCodigoDescuento.Text == "NAVIDAD")
	{
		precioFinal = precioFinal * 0.9;
	}

	MessageBox.Show("El precio final es de: $" + precioFinal);
}
  • Se evalúa cada producto individualmente.
  • El descuento se aplica solo si el código coincide.
  • El cálculo final se muestra al usuario.

Conceptos reforzados en el ejercicio

  • Uso de eventos en Windows Forms.
  • Manejo de ComboBox y ListBox.
  • Conversión de tipos (objectstring).
  • Recorridos con for.
  • Lógica condicional.
  • Aplicación de descuentos con operaciones matemáticas simples.

    c sharp Ejercicio 5 — 100 primeros números primos

  • Objetivo
    • Determinar si un número es primo.
    • Generar y mostrar los primeros 100 números primos.
  • Definición de número primo
    • Solo tiene dos divisores exactos:
      • 1
      • Él mismo
    • Ejemplos:
      • Primos: 2, 3, 5, 7, 11, 13
      • No primo: 6 (divisible por 2 y 3)

Estrategia para detectar si un número es primo

  • Idea principal
    • Probar si el número es divisible por algún valor distinto de 1 y de sí mismo.
  • Optimización básica
    • Empezar desde 2.
    • No comprobar 0 ni 1:
      • 0 no aporta información.
      • 1 es divisor de todos los números.
  • Herramienta clave
    • Operador resto %
      • Si numero % i == 0, entonces i es divisor.

Comprobación básica de número primo

Código — validar un número primo

private void button1_Click(object sender, EventArgs e)
{
	double numero = 7;
	bool esNumeroPrimo = true;

	for (int i = 2; i < numero; i++)
	{
		if (numero % i == 0)
		{
			esNumeroPrimo = false;
		}
	}

	if (esNumeroPrimo)
	{
		MessageBox.Show("El numero: " + numero + " es primo");
	}
	else
	{
		MessageBox.Show("El numero: " + numero + " no es primo");
	}
}

`

  • Se asume inicialmente que el número es primo.
  • Si se encuentra algún divisor, se marca como no primo.
  • El resultado se muestra mediante un mensaje.

Reutilización de lógica — función booleana

  • Problema
    • El código anterior solo muestra un mensaje.
    • No permite reutilizar el cálculo para otros números.
  • Solución
    • Crear una función que devuelva bool.
    • Separar lógica de presentación.

Función esPrimo

Código — función reutilizable

private bool esNumeroPrimo(double numero)
{
	bool esPrimo = true;

	for (int i = 2; i < numero; i++)
	{
		if (numero % i == 0)
		{
			esPrimo = false;
		}
	}

	return esPrimo;
}
  • El número se recibe como parámetro.
  • No se declara dentro de la función.
  • Devuelve:
    • true si es primo.
    • false si no lo es.
  • La variable interna se llama esPrimo para evitar confusión con el nombre de la función.

Generar los primeros 100 números primos

  • Estrategia
    • Empezar desde el número 2.
    • Probar cada número consecutivo.
    • Si es primo:
      • Guardarlo en el resultado.
      • Incrementar el contador.
    • Detener el proceso al llegar a 100 primos.

Control del bucle

  • Variables clave
    • double numero
      • Número que se va evaluando.
    • int contador
      • Cantidad de números primos encontrados.
    • string resultado
      • Acumula los números primos encontrados.
  • Regla importante
    • El número debe incrementarse siempre:
      • Sea primo o no.
      • Para evitar bucles infinitos.

Código — generar y mostrar 100 primos

private void button1_Click(object sender, EventArgs e)
{
	string resultado = "";
	double numero = 2;
	int contador = 0;

	while (contador < 100)
	{
		if (esNumeroPrimo(numero))
		{
			resultado = resultado + "," + numero;
			contador++;
		}

		numero++;
	}

	MessageBox.Show(resultado);
}
  • El while se controla con el contador de primos.
  • numero aumenta en cada iteración.
  • Solo cuando el número es primo se incrementa el contador.
  • El resultado final contiene los primeros 100 números primos.

Uso del debugger

  • Breakpoints
    • Permiten detener la ejecución en una línea concreta.
    • Útiles para entender el flujo del programa.
  • Qué observar
    • Valor de numero.
    • Valor de contador.
    • Evolución de resultado.
  • Flujo típico de depuración
    • Colocar breakpoint en la inicialización del resultado.
    • Ejecutar con F5.
    • Avanzar paso a paso para ver cómo se generan los primos.

Conceptos reforzados en esta parte

  • Operador módulo %.
  • Bucles for y while.
  • Funciones con retorno booleano.
  • Separación de lógica y presentación.
  • Control de bucles y prevención de infinitos.
  • Uso del debugger para análisis de flujo.

    c sharp POO — teoría

POO — teoría (Programación Orientada a Objetos)

La Programación Orientada a Objetos busca modelar el software a partir de entidades del mundo real, encapsulando datos y comportamientos, y facilitando la reutilización y extensión del código.

Pilares de la POO

  • Herencia
  • Abstracción
  • Polimorfismo
  • Encapsulamiento

Comparación: Programación estructurada vs POO

Programación estructurada

  • Uso intensivo de:
    • Arrays (incluyendo arrays multidimensionales)
    • Índices
    • Funciones independientes
  • Los datos y la lógica están separados.
  • Ejemplo típico
    • Un sistema de registro de empleados:
      • Array para nombres
      • Array para apellidos
      • Array para salarios
      • Función para cargar datos
  • Problema principal
    • Si se desea agregar otra entidad (por ejemplo, clientes):
      • Se deben crear nuevos arrays.
      • Se repite código.
      • Aumenta la complejidad y el riesgo de errores.

Programación Orientada a Objetos (POO)

  • El sistema se modela usando clases.
  • Cada clase representa un concepto:
    • Empleado
    • Cliente
    • Persona
  • Ventajas
    • Reutilización de código.
    • Extensibilidad.
    • Mejor organización.
    • Menor duplicación de lógica.

Clases, objetos y archivos

  • Clase
    • Es un molde o plantilla.
    • Contiene:
      • Propiedades (variables).
      • Métodos (funciones).
  • Objeto
    • Es una instancia concreta de una clase.
  • Buenas prácticas
    • Cada clase en su propio archivo.
    • Mejora la legibilidad y el mantenimiento del proyecto.

Herencia

  • Permite que una clase herede propiedades y métodos de otra.
  • Ejemplo conceptual
    • Clase base: Persona
    • Clases derivadas:
      • Empleado
      • Cliente
  • Beneficios
    • Evita duplicar atributos comunes:
      • Nombre
      • Apellido
      • Email
      • Teléfono

Clase abstracta

  • Se utiliza como base.
  • No se instancia directamente.
  • Sirve para definir características comunes.
  • Ejemplo
    • Persona es abstracta.
    • Solo se crean objetos de:
      • Empleado
      • Cliente

Polimorfismo

  • Significa “muchas formas”.
  • Permite que distintos objetos respondan de forma diferente al mismo método.

Caso práctico

  • En lugar de usar:
    • Un array de empleados.
    • Un array de clientes.
  • Se utiliza:
    • Un solo array del tipo Persona.

Método común

  • ToString()
    • Devuelve un texto con la información del objeto.
  • Comportamiento según el tipo
    • Cliente:
      • Nombre
      • Apellido
      • Email
      • Teléfono
    • Empleado:
      • Nombre
      • Apellido
      • Email
      • Teléfono
      • Salario
  • Resultado
    • Una única función.
    • Diferente resultado según la clase concreta.
    • Se logra polimorfismo mediante sobrescritura de métodos.

Encapsulamiento

  • Principio fundamental
    • Ocultar el estado interno del objeto.
  • Control de acceso
    • public
      • Accesible desde cualquier parte del código.
    • protected
      • Accesible desde la propia clase y sus clases hijas.
    • private
      • Accesible solo dentro de la misma clase.
  • Objetivo
    • Evitar modificaciones no controladas.
    • Proteger la integridad de los datos.

Interacción con el objeto

  • Toda interacción debe hacerse mediante métodos.
  • La clase actúa como una “caja negra”.
  • Se controla:
    • Qué se puede leer.
    • Qué se puede modificar.
    • Bajo qué condiciones.

Getters y setters

  • Permiten:
    • Leer valores.
    • Modificar valores con validaciones.
  • Ejemplo conceptual
    • Evitar asignar edades negativas.
    • Controlar formatos de email.
    • Validar salarios mínimos.

Sistema de gestión de clientes (WinForms)

Organización del proyecto

  • Agregar un nuevo formulario
    • Click derecho sobre el nombre del proyecto.
    • Agregar → Formulario de Windows Forms.
  • Renombrar archivos
    • GestionClientes.cs
    • Renombrar Form1 a Menu.cs
  • Interfaz inicial
    • Botón:
      • Texto: Gestionar clientes

Creación y uso de formularios como objetos

  • Una ventana también es un objeto.
  • Ejemplo de variable común
string nombre = "nombreeee";

`

  • Crear una instancia de un formulario
GestionClientes ventanaGestionClientes = new GestionClientes();
  • Mostrar el formulario
ventanaGestionClientes.ShowDialog();

Detalle sobre string

  • Estas dos formas son equivalentes:
string nombre = "nombreeee";
string nombre = new string("nombreeee");
  • El lenguaje simplifica la creación de objetos muy usados.
  • string es una clase, aunque se use con sintaxis abreviada.

Orden de ejecución y ventanas

  • Problema habitual
    • El orden de ejecución de los formularios afecta al flujo del programa.
  • ShowDialog()
    • Abre la ventana de forma modal.
    • Bloquea la ventana anterior hasta que se cierre.
  • Importancia
    • Controlar qué ventana se abre primero.
    • Evitar conflictos entre formularios.
    • Mantener una navegación clara en la aplicación.

Conceptos clave reforzados en esta parte

  • Diferencias entre programación estructurada y POO.
  • Clases, objetos e instancias.
  • Herencia y clases abstractas.
  • Polimorfismo mediante métodos comunes.
  • Encapsulamiento y control de acceso.
  • Formularios como objetos en WinForms.
  • Organización y flujo de ejecución del proyecto.

Temarios de cursos de C#

Temario estructural unificado (Super-temario)

Este super-temario reúne los temas comunes y principales de distintos cursos de C# disponibles en internet, organizados por niveles desde básico hasta avanzado. Está pensado como índice maestro para estudio, comparación de cursos o creación de notas en Obsidian.


1) Introducción a C# y .NET

  • ¿Qué es C#? Historia y características
  • La plataforma .NET
    • CLR (Common Language Runtime)
    • .NET Framework
    • .NET Core
    • .NET 5 / 6 / 7 / 8
  • Herramientas de desarrollo
    • Visual Studio
    • Visual Studio Code
    • .NET CLI (dotnet)
  • Estructura básica de un programa C#
  • Compilación y ejecución de aplicaciones

Recursos

  • https://learn.microsoft.com/dotnet/csharp/
  • https://learn.microsoft.com/dotnet/core/introduction

2) Fundamentos del lenguaje

  • Tipos de datos
    • Primitivos (int, double, bool, char)
    • Referencia (string, object)
    • Tipos numéricos y rangos
  • Variables y constantes
  • Operadores
    • Aritméticos
    • Lógicos
    • Relacionales
    • Bitwise
  • Expresiones y precedencia
  • Conversión de tipos
    • Implícita
    • Explícita (casting)
    • Parse, TryParse

Recursos

  • https://learn.microsoft.com/dotnet/csharp/fundamentals/types/

3) Control de flujo

  • Condicionales
    • if
    • else
    • else if
    • switch
  • Bucles
    • for
    • while
    • do while
    • foreach
  • Control de ejecución
    • break
    • continue
    • return

Recursos

  • https://learn.microsoft.com/dotnet/csharp/language-reference/statements/

4) Funciones y métodos

  • Declaración de métodos
  • Parámetros
    • Por valor
    • Por referencia (ref, out)
  • Valores de retorno
  • Sobrecarga de métodos
  • Scope y ciclo de vida de variables
  • Métodos estáticos vs métodos de instancia

Recursos

  • https://learn.microsoft.com/dotnet/csharp/programming-guide/classes-and-structs/methods

5) Colecciones y estructuras de datos

  • Arrays
    • Unidimensionales
    • Multidimensionales
  • Colecciones genéricas
    • List<T>
    • Dictionary<TKey, TValue>
    • Queue<T>
    • Stack<T>
  • Iteración con foreach
  • Diferencias entre arrays y colecciones dinámicas

Recursos

  • https://learn.microsoft.com/dotnet/csharp/programming-guide/concepts/collections

6) Manejo de cadenas de texto (Strings)

  • Concatenación
  • Interpolación ($"")
  • Métodos comunes de string
  • Inmutabilidad de strings
  • StringBuilder

Recursos

  • https://learn.microsoft.com/dotnet/api/system.string

7) Manejo de excepciones y depuración

  • Manejo de errores
    • try
    • catch
    • finally
  • Excepciones personalizadas
  • Debugging
    • Breakpoints
    • Step Over / Step Into
    • Inspección de variables
    • Call Stack

Recursos

  • https://learn.microsoft.com/dotnet/csharp/fundamentals/exceptions/

8) Programación Orientada a Objetos (POO)

  • Clases y objetos
  • Propiedades y campos
  • Constructores y destructores
  • Encapsulamiento
    • public
    • private
    • protected
    • internal
  • Herencia
  • Polimorfismo
  • Abstracción
    • Clases abstractas
    • Interfaces
  • virtual, override, sealed

Recursos

  • https://learn.microsoft.com/dotnet/csharp/fundamentals/object-oriented/

9) Delegados, eventos y expresiones lambda

  • Delegados
  • Eventos
  • Expresiones lambda
  • Funciones anónimas
  • Uso en interfaces gráficas y lógica de negocio

Recursos

  • https://learn.microsoft.com/dotnet/csharp/programming-guide/delegates/

10) LINQ y consultas de datos

  • Introducción a LINQ
  • Sintaxis de métodos
  • Sintaxis de consulta
  • Where, Select, OrderBy
  • Proyecciones y filtros
  • LINQ sobre colecciones y objetos

Recursos

  • https://learn.microsoft.com/dotnet/csharp/programming-guide/concepts/linq/

11) Archivos y entrada/salida

  • Lectura y escritura de archivos
  • File, FileInfo
  • StreamReader, StreamWriter
  • Rutas y directorios
  • Serialización básica (JSON / XML)

Recursos

  • https://learn.microsoft.com/dotnet/standard/io/

12) Temas avanzados y aplicaciones reales

  • Programación asíncrona
    • async / await
    • Task
  • Paralelismo y concurrencia
  • Genéricos avanzados
  • Gestión de memoria
  • Rendimiento
  • Desarrollo de aplicaciones reales
    • ASP.NET Core
    • APIs REST
    • Entity Framework Core
    • Desktop (WinForms / WPF)

Recursos

  • https://learn.microsoft.com/dotnet/standard/async/
  • https://learn.microsoft.com/aspnet/core/

Curso C# desde cero — YouTube

  • https://www.youtube.com/watch?v=TqiysLEBZo4
  • Variables, condicionales, bucles
  • Windows Forms
  • Ejercicios prácticos

Curso C# Completo — Udemy

  • https://www.udemy.com/course/c-sharp-beginner-to-advanced/
  • Fundamentos → POO → LINQ → Avanzado
  • Proyectos prácticos

Microsoft Learn — Ruta oficial C#

  • https://learn.microsoft.com/training/paths/csharp-first-steps/
  • Contenido oficial y actualizado
  • Enfoque profesional

libro c sharp NET en accion

Referencias principales

  • lockASPNETCore2018

Contexto del libro

  • Libro enfocado en ASP.NET Core aplicado a proyectos reales.
  • Orientado a entender:
    • El ciclo de vida de una aplicación web en .NET.
    • La arquitectura interna de ASP.NET Core.
    • El uso práctico del framework más allá de ejemplos básicos.
  • Combina teoría con implementación paso a paso.
  • Adecuado para desarrolladores con base previa en C# que quieren dar el salto a backend profesional.

Tecnologías y conceptos clave cubiertos

  • ASP.NET Core
  • Middleware y pipeline HTTP
  • Inyección de dependencias
  • Configuración y entornos
  • Hosting web con Kestrel
  • Routing
  • MVC y APIs
  • Seguridad y autenticación
  • Rendimiento y despliegue

Recursos oficiales y repositorios

Uso recomendado del libro

  • Como guía de arquitectura backend en . NET.
  • Para entender qué ocurre internamente cuando se procesa una request.
  • Como apoyo a cursos de:
  • Para leer en paralelo mientras se desarrolla un proyecto real.

Relación con otros temas

  • Complementa:
    • POO
    • Inyeccion-de-dependencias
    • Arquitectura-software
  • Base sólida para:
    • APIs REST
    • Microservicios en .NET
    • Aplicaciones web de alto rendimiento