Software engineering
Detalle sobre
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,TPLyasync 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
- Encapsula algoritmos intercambiables bajo una interfaz común.
- Elimina condicionales complejos (
if/else,switch). - Favorece extensibilidad y pruebas unitarias.
- Recurso: Mejora tu Código Eliminando IFs con el Patrón Strategy - YouTube
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
- Características modernas del lenguaje y runtime.
- 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.
- .NET 5 Runtime
- 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.
- Windows 10 SDK
- 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.
- dev_1
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.
- Genera un directorio llamado
cd MyApp- Cambia el directorio de trabajo al proyecto recién creado.
Estructura del proyecto
- Carpeta
MyAppMyApp.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
Debugpor 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,Desktopo una carpeta de trabajo.
- Mensaje típico:
- SDK no encontrado:
- Síntoma:
- Windows no detecta un SDK instalado.
- Causa:
- Variable de entorno
PATHmal configurada.
- Variable de entorno
- Recurso:
- Síntoma:
- Diagnóstico adicional:
- Ejecutar
dotnet --info. - Verificar
--list-sdksy--list-runtimes.
- Ejecutar
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.
- Aunque se use inferencia (
- 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_Clickson 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
Labelse 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;
}
intalmacena números enteros.doublealmacena 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):
bytesolo 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
shortvuelven al valor máximo al restar por debajo del mínimo.
- Tipos como
- 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
boolsolo admite:truefalse
- 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
ifejecuta 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
elsecubre el caso contrario. - Evita duplicar lógica innecesaria.
Formularios — renombrar controles
- Buenas prácticas de nombres:
label1→lblResultadotextBox1→txtEdad
- 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
TextBoxesstring. - 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.TryParsepara 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, zpara mundo 3D.
- Minecraft usando coordenadas
- 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.
- Precio:
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 Debuggingo teclaF5.- 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
%.
- 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
%.
- 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.Roundredondea 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.
- Añade elementos al
- Los valores se almacenan como objetos.
- Visualmente se muestran como texto.
Obtener el producto seleccionado
SelectedItem- Devuelve un
object. - Es necesario convertirlo a
string.
- Devuelve un
Conversión correcta
string productoSeleccionado = cboProductos.SelectedItem.ToString();
- Error común
- Intentar asignar directamente a
string.
- Intentar asignar directamente a
- Solución
- Usar
ToString().
- Usar
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);
}
ListBoxactú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.
- 10% de descuento equivale a multiplicar por
- 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
ComboBoxyListBox. - Conversión de tipos (
object→string). - 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)
- Solo tiene dos divisores exactos:
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, entoncesies divisor.
- Si
- Operador resto
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.
- Crear una función que devuelva
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:
truesi es primo.falsesi no lo es.
- La variable interna se llama
esPrimopara 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.
- El número debe incrementarse siempre:
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
whilese controla con el contador de primos. numeroaumenta 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.
- Valor de
- 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
forywhile. - 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
- Un sistema de registro de empleados:
- 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.
- Si se desea agregar otra entidad (por ejemplo, clientes):
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
- Teléfono
- Evita duplicar atributos comunes:
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
- Teléfono
- Empleado:
- Nombre
- Apellido
- Teléfono
- Salario
- Cliente:
- 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
Form1aMenu.cs
- Interfaz inicial
- Botón:
- Texto: Gestionar clientes
- Botón:
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.
stringes 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
- Primitivos (
- 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
ifelseelse ifswitch
- Bucles
forwhiledo whileforeach
- Control de ejecución
breakcontinuereturn
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
trycatchfinally
- 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
publicprivateprotectedinternal
- 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,FileInfoStreamReader,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/awaitTask
- 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
- Código fuente del libro
- Organización ASP.NET en GitHub
- Servidor web Kestrel
- Repositorio principal de ASP.NET Core
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
¿Te gusta este contenido? Suscríbete vía RSS