Eventos – Registro de Objetos
En el constructor de la clase Cuenta
registramos al titular de la cuenta como objeto
interesado en el evento:
public Cuenta(Persona titular, double saldo) {
…
ReintegroEvento += titular.AvisoReintegro;
}
Se utiliza += para el registro del método que
recibe la notificación del evento.
Por el contrario, para la eliminación se utiliza
-=.
Tema 2
Clases y Objetos
8
Eventos – Notificación del evento
El método Reintegro() lanza el evento si la
cantidad supera el límite y hay objetos
interesados:
Cualquier otra clase que esté interesada en los
eventos de Cuenta debe declarar un método
que cumpla el tipo del delegado.
La clase Banco declara un método compatible
con el tipo del evento para recibir los avisos:
public void Reintegros(Cuenta cuenta, double cantidad)
{
}
Una cuenta tiene asignado al menos un objeto
interesado en el evento: el titular de la cuenta.
El banco también se interesa en el evento. Se aplica un
reintegro que provoca el evento:
Cuenta cuentaEvt = new Cuenta(persona, 10000);
cuentaEvt.ReintegroEvento += banco.Reintegros;
cuentaEvt.Reintegro(5001);
Tras la ejecución son notificados el titular y el banco. Se
muestra por la consola:
Persona - Reintegro: 5001
Banco - Reintegro : 5001
Tema 2
Clases y Objetos
11
Métodos de extensión
Motivación:
Añadir un método en una clase existente, sin crear un
subtipo ni editar el código de la clase.
Los métodos de extensión se declaran en clases
“estáticas”.
El primer parámetro del método es la referencia al
objeto receptor y se utiliza el modificador this.
Dentro del código del método de extensión sólo
podemos acceder a las declaraciones visibles desde la
clase estática.
Para hacer uso de un método de extensión hay que
tener visibilidad sobre la clase estática en la que se
define.
En ningún caso un método de extensión
reemplaza a un método de la clase.
Tema 2
Clases y Objetos
12
Métodos de extensión
Ejemplo: método que simula el resultado de
un ingreso en una cuenta:
static class Extensiones {
// Método de extensión de la clase Cuenta
public static double SimulaIngreso ( this Cuenta cuenta,
{
}
return cuenta.Saldo + cantidad;
int cantidad)
}
cuenta.SimulaIngreso(20);
Tema 2
Clases y Objetos
13
Tipos valor anulables
Motivación:
Permitir que un tipo por valor admita el valor
especial null.
Resulta útil cuando se obtienen datos de una
consulta a una base de datos relacional. El modelo
relacional admite nulos para los tipos primitivos.
Declaración: añadir ? a un tipo por valor
int? intAnulable;
Punto? puntoAnulable;
Tema 2
Clases y Objetos
14
Tipos valor anulables
Métodos disponibles:
HasValue:
indica si almacena un valor null.
GetValueOrDefault:
para obtener el valor del tipo anulable, o un valor
por defecto si almacena null.
Recibe como argumento el valor por defecto.
Tema 2
Clases y Objetos
15
Tipos valor anulables
int? intAnulable;
int entero;
intAnulable = null;
if (! intAnulable.HasValue)
Declaración de variables sin tipo:
var cuenta = new Cuenta(persona, 500);
Se utiliza la palabra clave var para indicar que
debe inferirse el tipo de la variable.
En el ejemplo, el compilador determina que la
variable tiene como tipo estático Cuenta.
Tema 2
Clases y Objetos
17
Objetos anónimos
Permiten declarar objetos en línea
estableciendo un conjunto de propiedades con
sus valores.
método ToString.
Tienen implementado automáticamente el
Sobre una variable que referencia a un objeto
anónimo es posible acceder a las propiedades.
var pagina = new {Nombre = "UMU", Web = "http://www.um.es/"};
Console.WriteLine("Página: " + pagina);
Console.WriteLine("Nombre de la página: " + pagina.Nombre);
Tema 2
Clases y Objetos
18
LINQ
Facilidad de consulta sobre estructuras de datos
integrada en el lenguaje (LanguageINtegrated
Query).
Define un modelo de consulta abstracto que es
aplicable a cualquier modelo de datos:
colecciones, consultas a una base de datos
relacional, etc.
Esquema básico de consulta:
from colección de objetos iterables
where condición definida como expresión lambda
select objeto de la colección o anónimo.
Tema 2
Clases y Objetos
19
LINQ – Ejemplo
Ejemplo: se realiza una consulta sobre una
lista de cuentas.
El resultado de la consulta son objetos
anónimos.
Se aplica inferencia de tipos en las variables.
var resultado =
from c in cuentas
where c.Saldo > 400
select new { Saldo = c.Saldo, Titular = c.Titular };
foreach (var c in resultado) {
Console.WriteLine("Resultado LINQ " + c);
}
Tema 2
Clases y Objetos
20
Links de descarga
http://lwp-l.com/pdf2104
Comentarios de: Características Avanzadas en C# (0)
Comentarios de: Características Avanzadas en C# (0)
No hay comentarios