c# - recorrer - ¿Cómo inicializar una lista con el constructor?
public list c# (5)
¿Estás buscando esto?
ContactNumbers = new List<ContactNumber>(){ new ContactNumber("555-5555"),
new ContactNumber("555-1234"),
new ContactNumber("555-5678") };
Tengo un tipo
public class Human
{
public int Id { get; set; }
public string Address { get; set; }
public string Name { get; set; }
public List<ContactNumber> ContactNumbers { get; set; }
public Human(int id)
{
Id = id;
}
public Human(int id, string address, string name,
List<ContactNumber> contactNumbers) :
this(id)
{
Address = address;
Name = name;
ContactNumbers = contactNumbers;
}
}
¿Por favor, guíame? ¿Entre las mejores prácticas para usar el constructor para la inicialización de listas? ¿Cómo inicializar una lista usando el constructor?
Editar:
¿Por favor, guíame? ¿Entre las mejores prácticas para usar el constructor para la inicialización de listas? ¿Cómo asignar valores a la lista utilizando un constructor, por lo que si no se pasa un valor, se utilizará un valor predeterminado?
Gracias
En general, no exponga la List<T>
públicamente, y no proporcione definidores para las propiedades de la colección. Además, es posible que desee copiar los elementos de la lista aprobada (como se muestra a continuación). De lo contrario, los cambios en la lista original afectarán a la instancia de Human.
public class Human
{
public Human()
{
}
public Human(IEnumerable<ContactNumber> contactNumbers)
{
if (contactNumbers == null)
{
throw new ArgumentNullException("contactNumbers");
}
_contactNumbers.AddRange(contactNumbers);
}
public IEnumerable<ContactNumber> ContactNumbers
{
get { return _contactNumbers; }
}
private readonly List<ContactNumber> _contactNumbers = new List<ContactNumber>();
}
Otra opción es usar el constructor de listas que toma una colección y eliminar el inicializador de campo.
Puedes inicializarlo como cualquier lista:
public List<ContactNumber> ContactNumbers { get; set; }
public Human(int id)
{
Id = id;
ContactNumbers = new List<ContactNumber>();
}
public Human(int id, string address, string name) :this(id)
{
Address = address;
Name = name;
// no need to initialize the list here since you''re
// already calling the single parameter constructor
}
Sin embargo, incluso me gustaría ir un paso más allá y hacer que el configurador sea privado, ya que a menudo no es necesario configurar la lista, sino simplemente acceder / modificar su contenido:
public List<ContactNumber> ContactNumbers { get; private set; }
Usando un inicializador de colección
Desde C # 3, puede usar inicializadores de colección para construir una lista y rellenarla con una sola expresión. El siguiente ejemplo construye un humano y sus números de contacto:
var human = new Human(1, "Address", "Name") {
ContactNumbers = new List<ContactNumber>() {
new ContactNumber(1),
new ContactNumber(2),
new ContactNumber(3)
}
}
Especializando el constructor Human
Puede cambiar el constructor de la clase Human
para proporcionar una manera de rellenar la propiedad ContactNumbers
:
public class Human
{
public Human(int id, string address, string name, IEnumerable<ContactNumber> contactNumbers) : this(id, address, name)
{
ContactNumbers = new List<ContactNumber>(contactNumbers);
}
public Human(int id, string address, string name, params ContactNumber[] contactNumbers) : this(id, address, name)
{
ContactNumbers = new List<ContactNumber>(contactNumbers);
}
}
// Using the first constructor:
List<ContactNumber> numbers = List<ContactNumber>() {
new ContactNumber(1),
new ContactNumber(2),
new ContactNumber(3)
};
var human = new Human(1, "Address", "Name", numbers);
// Using the second constructor:
var human = new Human(1, "Address", "Name",
new ContactNumber(1),
new ContactNumber(2),
new ContactNumber(3)
);
Línea de fondo
¿Qué alternativa es una mejor práctica? ¿O al menos una buena práctica? Lo juzgas En mi opinión, la mejor práctica es escribir el programa lo más claramente posible a cualquiera que tenga que leerlo. El uso del inicializador de colección es un ganador para mí, en este caso. Con mucho menos código, puede hacer casi las mismas cosas que las alternativas, al menos, las alternativas que di ...
ContactNumbers = new List<ContactNumber>();
Si quieres que pase, solo toma
public Human(List<ContactNumber> numbers)
{
ContactNumbers = numbers;
}