Está en la página 1de 4

C#, Inicializadores de Objeto y de Coleccin

Los inicializadores de objeto permiten asignar valores a los campos o propiedades de un objeto en el momento de la creacin sin tener que invocar explcitamente un constructor.

C# 3.0, Nueva Caracterstica


Esta caracterstica fue incorporada a partir de la versin C# 3.0 y sigue el camino de la simplificacin de cdigo, al igual que otras caractersticas que ir comentando en sucesivos artculos. Pero en fin, veamos un ejemplo que nos deje el concepto del todo claro:
namespace Pruebas { class Program { static void Main(string[] args) { // Inicializador de Objeto Contacto objContacto = new Contacto { IdContacto=3, Nombre="Pedro", Telefono = "601 01 01 01" };

//Inicializador de Coleccin List<Contacto> lstContactos = new List<Contacto> { new Contacto { IdContacto=1, Nombre="Pedro", Telefono="601 01 01 01" }, new Contacto { IdContacto=2, Nombre="Maria", Telefono="601 01 01 02" },

objContacto,
new Contacto { IdContacto=4, Nombre="Juana", Telefono="601 01 01 03" } }; //Inicializador de Array Variante 1 var arrContactos1 = new[] { new Contacto { IdContacto=11, Nombre="Pedro", Telefono="601 01 01 01" }, new Contacto { IdContacto=12, Nombre="Maria", Telefono="601 01 01 02" }, new Contacto { IdContacto=13, Nombre="Juana", Telefono="601 01 01 03" } };

//Inicializador de Array Variante 2 Contacto[] arrContactos2 = { new Contacto { IdContacto=14, Nombre="Pedro", Telefono="601 01 01 01" }, new Contacto { IdContacto=15, Nombre="Maria", Telefono="601 01 01 02" }, new Contacto { IdContacto=16, Nombre="Juana", Telefono="601 01 01 03" } };

} }

public class Contacto { public int IdContacto {get; set;} public string Nombre { get; set; } public string Telefono { get; set; } } }

Y as de simple es crearnos un objeto o una coleccin de objetos e inicializarlos en la misma lnea. Nota: En el ejemplo, hemos usado la clase Contacto y en ella hemos usado otra nueva caracterstica de C# 3.0, se trata de las propiedades auto implementadas. Para obtener ms informacin, consulte Propiedades auto implementadas.

Inicializador de Objeto Avanzado


El ejemplo anterior es bastante til y frecuente, pero en determinadas ocasiones pudiramos encontrarnos con la necesidad de inicializar objetos que poseen propiedades de solo lectura, que solo son seteados a travs de constructores, veamos el ejemplo: namespace Pruebas { class Program { static void Main(string[] args) {

Contacto objContacto = new Contacto { Nombre="Pedro", Telefono = "601010101" };

var ctoEspecial1 = new ContactoEspecial(1) { Nombre="Mario", Telefono="622010101" };

ContactoEspecial ctoEspecial2 = new ContactoEspecial(1) { Nombre="Paloma", Telefono="622010102" }; } } public class Contacto { public string Nombre { get; set; } public string Telefono { get; set; } } public class ContactoEspecial : Contacto { public int TipoContacto { get; private set; } public ContactoEspecial(int tipo) { TipoContacto = tipo; } } } En el cdigo anterior, hemos creado 2 clases Contacto y ContactoEspecial, esta ultima hereda de la clase contrato y adiciona una nueva propiedad TipoContacto que podemos leer pero no escribir, es de solo lectura (fjate en el modificador private). Al ser TipoContacto de solo lectura, no podemos inicializar esta propiedad de forma directa como hicimos en el primer ejemplo de cdigo, para ello fue necesario llamar al constructor de la clase y luego continuar la inicializacin: var ctoEspecial1 = new ContactoEspecial(1) { Nombre="Mario", Telefono="622010101" }; ContactoEspecial ctoEspecial2 = new ContactoEspecial(1) { Nombre="Paloma", Telefono="622010102" };

Estas dos lneas anteriores son muy similares en cuanto al resultado obtenido, ambas inicializan un objeto de tipoContactoEspecial, solo la he empleado para poner un ejemplo de inferencia de tipo, de esto hablar mas en otro momento.