Números aleatorios y eventos en C#
Clase 22 de 35 • Curso de C# con .Net Core 2.1
Contenido del curso
Etapa 5 – POO reutilicemos nuestro código
- 2

Herencia para reutilizar código C#
10:30 min - 3

Herencia y Polimorfismo en Programación Orientada a Objetos
11:42 min - 4

Polimorfismo en Programación Orientada a Objetos
13:17 min - 5

Casting en C#: cuándo funciona y cuándo falla
07:09 min - 6

Conversiones seguras en C# con is y as
12:44 min - 7

Sobrescribir ToString para depuración en C#
08:15 min
Etapa 6- Ajustes y funcionalidad
Etapa 7 – Preparando información para nuestros reportes
- 11

Manejo Avanzado de Métodos y Parámetros en Programación
15:43 min - 12

Manejo de Parámetros de Salida en Visual Studio Code
04:38 min - 13

Sobrecarga de Métodos para Parámetros de Salida Opcionales
05:51 min - 14

Optimización de Listas: Buenas Prácticas en C#
04:16 min - 15

Dictionary: cómo funciona en C#
11:14 min - 16

Diccionarios con polimorfismo en C#
10:48 min - 17

Uso de Constantes y Enumeraciones para Optimizar Diccionarios en C#
11:33 min - 18

Foreach anidado para diccionarios en C#
13:47 min - 19

Depuración de diccionarios en C#
09:37 min - 20

Parámetro opcional para controlar impresión en C#
11:47 min - 21

Cómo usar switch en lugar de if/else
14:30 min - 22

Números aleatorios y eventos en C#
Viendo ahora - 23

Diccionarios y Refactoring en Programación Básica
02:13 min
Etapa 8 – Consultas
- 24

Cómo crear un reporteador en C sharp
11:42 min - 25

Generación segura de reportes en sistemas de información
10:21 min - 26

Construcción de reportes con LINQ en C#
11:48 min - 27

Diccionario con evaluaciones por asignatura
08:32 min - 28

Tipos anónimos en LINQ para reportes complejos
10:52 min - 29

Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
10:46 min - 30

Creación de Tipos de Datos Personalizados en Programación Avanzada
12:05 min - 31

Generación de Reportes con LINQ en C#
02:09 min
Etapa 9 – Creando una UI de Consola
Mejora la calidad de tu código en C# con dos ajustes clave: una aleatoriedad realmente indistinta y el uso práctico de eventos con delegados y expresiones lambda. Verás cómo evitar secuencias repetitivas al generar números y cómo ejecutar acciones limpias al finalizar tu aplicación con AppDomain.
¿Cómo evitar patrones al generar números aleatorios en C#?
La causa de números repetidos estaba en crear el generador dentro de un foreach usando una semilla basada en System.Environment.TickCount. Como el bucle corre en el mismo milisegundo, se reutiliza la misma semilla aleatoria y se repiten las secuencias. La solución: mover el generador fuera del bucle y dejar que use la semilla por defecto.
- Crear el generador una vez y reutilizarlo en todo el método.
- Evitar paréntesis innecesarios: solo castear a
floatel resultado del método que produce el doble. - Comprobar con
dotnet runque desaparecen las notas repetitivas.
Ejemplo de código limpio:
// Crear una sola instancia del generador.
var random = new Random();
// Dentro de tu bucle.
// Castea únicamente el valor producido por el método que genera el doble.
float valor = (float)random.NextDouble();
Punto clave: TickCount son milisegundos desde que se encendió la máquina. Si recreas Random dentro del bucle, puedes quedar siempre en el mismo milisegundo y repetir el mismo orden de números.
¿Qué es un evento ProcessExit y cómo suscribirse?
Un evento dispara una o varias acciones cuando ocurre un acontecimiento. En este caso, AppDomain.CurrentDomain.ProcessExit se dispara cuando la aplicación termina. Con += suscribes un manejador (un método) que ejecutará tu lógica final, como un bip y mensajes de salida.
- El evento se dispara al finalizar la app, incluso si usas
returnen el flujo. - Se suscribe con
+=a un método compatible con la firma del evento. - Ejemplo práctico: un bip de 3000 Hz por 1000 ms, tres veces, y títulos “Saliendo” y “Salió”.
Implementación directa:
// Suscripción al evento de finalización de la aplicación.
AppDomain.CurrentDomain.ProcessExit += AccionDelEvento;
// La firma típica del event handler recibe un objeto y argumentos.
static void AccionDelEvento(object sender, EventArgs e)
{
printer.Bip(3000, 1000, 3);
printer.WriteTitle("Saliendo");
printer.WriteTitle("Salió");
}
Nota: si la aplicación termina de forma anormal con throw new exception, el evento no se ejecuta porque el flujo se revienta antes de completar la lógica.
¿Cómo encadenar y remover manejadores: multicast delegate y lambda?
Los eventos soportan múltiples acciones acumuladas: son un multicast delegate. Puedes agregar más manejadores con += (incluyendo expresiones lambda) y removerlos con -=.
- La firma del manejador importa:
objectyEventArgs(aunque no los uses) deben estar presentes. - Evita el error “inconsistent lambda parameter usage”: define todos los parámetros explícitos o implícitos, pero no mezcles.
- Puedes sumar un bip distinto y luego quitar selectivamente cualquier manejador.
Ejemplo con lambda y remoción:
// Segundo manejador con lambda: un bip distinto para diferenciar.
AppDomain.CurrentDomain.ProcessExit += (object o, EventArgs e) =>
{
printer.Bip(2000, 1000, 1);
};
// Remover el manejador nombrado si ya no lo necesitas.
AppDomain.CurrentDomain.ProcessExit -= AccionDelEvento;
Ideas clave para tu práctica:
- Usa una sola instancia de Random por método o por clase para evitar repetir secuencias.
- Minimiza conversiones: castea solo lo necesario y mejora la legibilidad.
- Comprende la naturaleza de los eventos: un suceso puede disparar muchas acciones.
- Controla el ciclo de vida de los manejadores: suscribe y desuscribe según tu lógica.
- Distingue terminación normal vs. anormal: con throw new exception el evento puede no ejecutarse.
¿Quieres que profundicemos en patrones de eventos, mejores prácticas con delegates y lambda, o ejemplos con botones y servicios en Windows y Linux? Cuéntame en los comentarios qué caso te gustaría ver aplicado a tu proyecto.