Nota: en este documento voy a almacenar las cosas que considero más críticas para el examen
Clases de utilidad (static)
Las clases de utilidad han de llevar static, es decir: public static class EjemploAyuda
Propiedades
Permiten acceder al estado de los objetos como si de atributos se tratase
Se oculta el estado interno del objeto, ofreciendo un acceso indirecto mediante las propiedades (encapsulamiento)
Arrays Multidimensionales
Existen dos tipos:
Arrays Lineales: memoria contigua lineal, de varias dimensiones
Arrays de Arrays: permite la construcción de arrays irregulares
Paso de parámetros
Paso por valor
El parámetro formal es una copia del parámetro real
NO SE MODIFICA EL VALOR
Paso por referencia de entrada y salida (ref)
Se pasa con un valor (entrada) y se le puede asignar otro (salida), modificando el original
SE MODIFICA EL VALOR
Paso por referencia de salida (out)
Se pasa sin valor (entrada) y sirve para devolver más de un valor
Salida:
Parámetros Opcionales
Siempre tienen que ser los últimos (más a la derecha)
Declaración implícita de variables
No se requiere especificar su tipo siempre que se asigne un valor en la declaración
Métodos extensores
Hay que crear una clase de utilidad (`static)
Hay que implementar un método de clase static en dicha clase de utilidad
El primer parámetro tiene que declararse anteponiendo la palabra reservada this
Herencia
Mecanismo de reutilización de código
Polimorfismo
Mecanismo de generalización, que hace que la abstracción más general pueda representar abstracciones más específicas
Si se implementa, el tipo ha de ser object, NOT (T es genericidad)
Enlace dinámico
Los métodos heredados se pueden especializar en las clases derivadas
En las clase base hay que poner virtual al método
En las clases derivadas hay que poner override al método
Operadores isas
El operador is nos permite comprobar si un objeto es de tipo X
El problema es que si después de usar el operador is vamos a realizar un cast (como e muestra arriba), es mejor usar directamente as
Autoboxing (boxing y unboxing)
Los tipos simples (int, char, float, double…) ¡no heredan de Object!
Ejemplo: int promociona a Int32 y un Int32 se convierte automáticamente en int
IDisposable y Destructores
Una clase que defina un constructor, comúnmente implementará IDisposable:
Esto es susceptible de ser olvidado.
Por ello se usa la palabra using para asegurar la liberación de los recursos adicionales de un objeto IDisposable
incluso si se lanza una excepción y no se maneja
Un ejemplo completo:
Programación por contrato (precondiciones, postcondiciones, invariante)
Siguen esta estructura:
Precondiciones: se ponen antes de la sección crítica
Postcondiciones: se ponen justo después de la sección crítica
Invariante: se llama lo primero en un método y lo último (es lo que a narices no puede estar mal o ser de otra forma, por ejemplo que una lista tenga -2837456 elementos), y en los constructores se llama lo último
Genericidad
Se usa T
No confundir con tipo polimórfico (donde se usa object)
El tipo por defecto es default(T)
Ejemplo de método genérico
Ejemplo de clase Genérica:
Genericidad acotada
Se indica con el where T: IComparable<T>
Útil en métodos de ordenación donde haya una lista con elementos de varios tipos
IEnumerable<T>
Esta interfaz representa una colección de elementos genérica
Un objeto que implemente IEnumerable se puede recorrer con un foreach
La interfaz IEnumerable sólo posee un método: GetEnumerator()
Este método construye un iterador
Tipos anulables
Hay que poner ? al tipo simple: int?, double? …
Sus principales miembros son las propiedades:
HasValue:bool
Value:T
Colecciones
Existe la librería: System.Collections.Generics, que incluye:
List<T>: vector cuyo tamaño es variable dinámicamente
Dictionary<Key,Value>: colección de pares clave/contenido organizados mediante hashing de la clave
HashSet<T>: colección en la que los elementos no pueden estar repetidos (conjuntos)
LinkedList<T>: lista doblemente enlazada
Queue<T>: colección con política FIFO (cola)
Stack<T>: colección con política LIFO (pila)
SortedDictionary<T>: colección de pares clave/contenido ordenados por clave