fork download
  1. using System;
  2.  
  3. namespace Articulos.Cap04
  4. {
  5. // Clase contenedora de los datos del evento de cambio de precio:
  6. internal class PrecioCambioEventArgs : EventArgs
  7. {
  8. public readonly decimal PrecioAnterior;
  9. public readonly decimal PrecioNuevo;
  10.  
  11. public PrecioCambioEventArgs(decimal precioAnterior, decimal precioNuevo)
  12. {
  13. PrecioAnterior = precioAnterior;
  14. PrecioNuevo = precioNuevo;
  15. }
  16. }
  17.  
  18. // Clase que representa un producto (únicamente con su precio).
  19. // Clase publicadora (broadcaster):
  20. internal class Producto
  21. {
  22. // Precio del producto:
  23. decimal precio;
  24.  
  25. // Evento que dispara cuando hay un cambio de precio del producto:
  26. public event EventHandler<PrecioCambioEventArgs> PrecioCambio;
  27.  
  28. protected virtual void OnPrecioCambio (PrecioCambioEventArgs e)
  29. {
  30. if (PrecioCambio != null)
  31. {
  32. PrecioCambio (this, e);
  33. }
  34. }
  35.  
  36. public decimal Precio
  37. {
  38. get
  39. {
  40. return precio;
  41. }
  42. set
  43. {
  44. if (precio == value)
  45. {
  46. return;
  47. }
  48.  
  49. decimal precioViejo = precio;
  50. precio = value;
  51.  
  52. // Se invoca cuando hay diferencai del precio anterior
  53. // con un nuevo precio:
  54. OnPrecioCambio (new PrecioCambioEventArgs (precioViejo, precio));
  55. }
  56. }
  57. }
  58.  
  59. internal class Aplicacion
  60. {
  61. public static void Main()
  62. {
  63. Producto producto = new Producto();
  64.  
  65. // Asignamos un precio nuevo al producto:
  66. producto.Precio = 27.10M;
  67.  
  68. // Register with the PrecioChange event:
  69. producto.PrecioCambio += PrecioCambio;
  70. producto.Precio = 31.59M;
  71. }
  72.  
  73. // Método compatible con la firma del delegado genérico.
  74. // Este método es invocado de forma indirecta cuando el
  75. // evento de cambio de precio se genera:
  76. public static void PrecioCambio(object sender, PrecioCambioEventArgs e)
  77. {
  78. if ((e.PrecioNuevo - e.PrecioAnterior) / e.PrecioAnterior > 0.1M)
  79. {
  80. Console.WriteLine("¡Alerta, el precio del producto ha incrementado un 10%!");
  81. }
  82. }
  83. }
  84. }
Success #stdin #stdout 0.03s 33816KB
stdin
Standard input is empty
stdout
¡Alerta, el precio del producto ha incrementado un 10%!