static void Main(string[] args) { EncabezadoYPieConsola _separador = new EncabezadoYPieConsola(); #region Ejemplo 1: Propiedades y campos de sólo lectura _separador.EscribirEncabezado("Ejemplo 1: Propiedades y campos de sólo lectura"); Casa casaDeSherlock = new Casa("221B Baker Street, London", 221); Persona sherlock = new Persona("Sherlock", "Holmes", casaDeSherlock); Console.WriteLine("Valores antes de pasarle el objeto a ClaseConfiable"); ImprimirDetalles(sherlock); //Ahora le pasamos el objeto a ClaseConfiable, confiando en que no va a cambiarlo //apoyados en la protección que le pusimos a las propiedades y a su único campo ClaseConfiable.LeerSinCambiar(sherlock); //Veamos ahora si cambió algo Console.WriteLine("Valores después de pasarle el objeto a ClaseConfiable"); ImprimirDetalles(sherlock); //Volvemos a poner los valores en orden casaDeSherlock.Direccion = "221B Baker Street, London"; casaDeSherlock.Superficie = 221; Console.WriteLine("Después de volver a ajustar los valores"); ImprimirDetalles(sherlock); _separador.EscribirPie("Fin Ejemplo 1"); #endregion #region Ejemplo 2: Clase de Solo Lectura _separador.EscribirEncabezado("Ejemplo 2: Clase de Solo Lectura"); List <Persona> listaDePersonas = new List <Persona>(); listaDePersonas.Add(sherlock); ReadOnlyCollection <Persona> listaSoloLectura = listaDePersonas.AsReadOnly(); Console.WriteLine("Antes de pasar la lista a ClaseConfiable"); Console.WriteLine("Contiene a la persona Sherlock? {0}", listaSoloLectura.Contains(sherlock).ToString()); Console.WriteLine("Hogar de Sherlock: {0}", listaSoloLectura[0].Hogar.Direccion.ToString()); ClaseConfiable.LeerColeccionSoloLectura(listaSoloLectura); Console.WriteLine("Después de pasar la lista a ClaseConfiable"); Console.WriteLine("Contiene a la persona Sherlock? {0}", listaSoloLectura.Contains(sherlock).ToString()); Console.WriteLine("Hogar de Sherlock: {0}", listaSoloLectura[0].Hogar.Direccion.ToString()); _separador.EscribirPie("Fin Ejemplo 2"); #endregion #region Ejemplo 3 _separador.EscribirEncabezado("Ejemplo 3 - Colecciones de Sólo Lectura"); int[] arrayDeEnteros = new int[] { 1, 2, 3 }; ReadOnlyCollection <int> enterosReadOnly = new ReadOnlyCollection <int>(arrayDeEnteros); Console.WriteLine("Antes de cambiar el array"); foreach (int entero in enterosReadOnly) { Console.WriteLine(entero.ToString()); } arrayDeEnteros[0] = 0; Console.WriteLine("Después de cambiar el array"); foreach (int entero in enterosReadOnly) { Console.WriteLine(entero.ToString()); } _separador.EscribirPie("Fin ejemplo 3"); #endregion #region Ejemplo 4: Uso simple de Colecciones Inmutables con métodos de extensión LineaDeOrden tornillos = new LineaDeOrden(500, 1.25m, 0.0f); LineaDeOrden tuercas = new LineaDeOrden(500, 0.75m, 0.0f); List <LineaDeOrden> lineas = new List <LineaDeOrden> { tornillos, tuercas }; Orden ordenDeFerreteria = new Orden(lineas); Orden ordenDeFerreteriaConDescuento = ordenDeFerreteria.ModificarLineaDeOrden(tornillos, tornillos.ConDescuento(0.2f)); #endregion #region Ejemplo 5: Otro modo de uso con métodos estáticos //Sin salida en la consola, sólo para mostrar como se utilizan int[] enterosPrimos = new int[] { 2, 3, 5, 7, 11 }; ImmutableArray <int> enterosArrayInmutable = ImmutableArray.Create <int>(enterosPrimos); ImmutableArray <int> enterosArrayInmutableNuevo = ImmutableArray.ToImmutableArray <int>(enterosPrimos); ImmutableArray <int> enterosArrayInmutableUltimo = enterosPrimos.ToImmutableArray <int>(); #endregion #region Ejemplo 6: Métodos encadenados (interfaces fluídas) _separador.EscribirEncabezado("Ejemplo 6: Métodos encadenados - Interfases fluidas"); //Lo siguiente funciona pero no es eficiente ImmutableArray <int> enterosParesVacio = ImmutableArray.Create <int>(); ImmutableArray <int> enterosParesCompleto = enterosParesVacio.Add(2).Add(4).Add(6).Add(8).Add(10); Console.WriteLine("Enumeración del primer array que comenzó vacío"); foreach (int item in enterosParesVacio) { Console.WriteLine(item.ToString()); } Console.WriteLine("Enumeración del segundo array"); foreach (int item in enterosParesCompleto) { Console.WriteLine(item.ToString()); } //Es preferible ésto: int[] enterosParesEficientes = new int[5] { 2, 4, 6, 8, 10 }; ImmutableArray <int> enterosParesInmutables = enterosParesEficientes.ToImmutableArray <int>(); Console.WriteLine("Veamos que hay en el tercer array"); foreach (int item in enterosParesInmutables) { Console.WriteLine(item.ToString()); } //Me había olvidado de agregar algunos pares más: ImmutableArray <int> .Builder bob = enterosParesInmutables.ToBuilder(); bob.Add(12); bob.Add(14); ImmutableArray <int> nuevosEnterosPares = bob.ToImmutableArray <int>(); Console.WriteLine("Sí pudimos! Gracias, Bob"); foreach (int item in nuevosEnterosPares) { Console.WriteLine(item.ToString()); } //Aún hay más! ImmutableList <int> listaDeEnteros = bob.ToImmutableList <int>(); Console.WriteLine("Finalmente, iteremos sobre la lista armada en base al mismo constructor"); foreach (int item in listaDeEnteros) { Console.WriteLine(item.ToString()); } _separador.EscribirPie("Fin ejemplo 6"); #endregion }
public Orden AgregarLineaDeOrden(LineaDeOrden nuevaLinea) { return(ConLineasDeOrden(LineasDeOrden.Add(nuevaLinea))); }
public Orden ModificarLineaDeOrden(LineaDeOrden lineaOriginal, LineaDeOrden lineaModificada) { return(lineaOriginal == lineaModificada ? this : ConLineasDeOrden(LineasDeOrden.Replace(lineaOriginal, lineaModificada))); }
public Orden BorrarLineaDeOrden(LineaDeOrden lineaABorrar) { return(ConLineasDeOrden(LineasDeOrden.Remove(lineaABorrar))); }