2012-01-31 25 views
27

tengo un tipo:¿Cómo inicializar una lista con el constructor?

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; 
    }   
} 

favor, me guía se encuentra entre las mejores prácticas de usar constructor de lista de inicialización? ¿Cómo inicializar una lista usando el constructor?

Editar:

favor, me guía se encuentra entre las mejores prácticas de usar constructor de lista de inicialización? ¿Cómo asignar valores a la lista usando un constructor, por lo que si no se pasa ningún valor, se usará un valor predeterminado?

Gracias

Respuesta

46

El uso de un inicializador de colección

De C# 3, puede utilizar inicializadores de colección para construir una lista y rellenarla usando una sola expresión. El siguiente ejemplo construye un humano y sus ContactNumbers:

var human = new Human(1, "Address", "Name") { 
    ContactNumbers = new List<ContactNumber>() { 
     new ContactNumber(1), 
     new ContactNumber(2), 
     new ContactNumber(3) 
    } 
} 

especializar el Human constructor

Puede cambiar el constructor de la clase Human para proporcionar una manera de poblar el ContactNumbers propiedad:

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 inferior

¿Qué alternativa es una mejor práctica? ¿O al menos una buena práctica? ¡Lo juzgas! OMI, la mejor práctica es escribir el programa lo más claramente posible a cualquiera que tenga que leerlo. Usar el inicializador de la 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 ...

+0

gracias Humberto, por favor vea mi edición – haansi

3
ContactNumbers = new List<ContactNumber>(); 

Si usted quiere que sea aprobada en, acaba de tomar

public Human(List<ContactNumber> numbers) 
{ 
ContactNumbers = numbers; 
} 
+0

Gracias @ eouw0o83hf, Lo siento por mi explicación no es suficiente. Quiero pasar números para la lista usando el constructor. Amablemente también, ¿es una buena forma de pasar valores a la lista al igual que pasamos otros valores? – haansi

+0

¿Está buscando la [palabra clave params] (http://msdn.microsoft.com/en-us/library/w5zay9db.aspx)? – TrueWill

+0

No TrueWill, quiero asignar valores a la lista using constructor. Por favor, también guía cómo manejar si no se asignan valores (¿cuál sería el valor predeterminado? ¿Es una forma estándar? – haansi

2

puede inicializar al igual que 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 iría un paso más allá y hará que el colocador sea privado ya que a menudo no necesita configurar la lista, sino Cess/modificar su contenido:

public List<ContactNumber> ContactNumbers { get; private set; } 
+0

Gracias @Lirik, amablemente guía cómo pasar los valores a la lista de constrcot? ¿También es una guía la forma estándar de usar el constroctor para pasar valores a una propiedad que básicamente es una lista? – haansi

1

En general no exponga List<T> públicamente, y no proporcionan los emisores de propiedades de 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 Humana.

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 utilizar el constructor de lista que toma una colección y elimina el inicializador de campo.

+0

Gracias @TrueWill, ¿no podemos completar una lista y pasarla al constructor justo cuando pasamos otros valores a través del constructor y si no hay valores, entonces asignamos un valor predeterminado? ¿Cómo se hará? ¿Es una buena manera de hacerlo? – haansi

+1

Depende. Estás pasando una ** referencia **. ¿Desea que los contactos del Humano cambien cuando se cambia la lista de contactos original? Si desea una lista predeterminada, normalmente agregaría un constructor predeterminado a Human que crearía una lista vacía. Evite las referencias nulas siempre que sea posible. También evite las listas vacías de envoltorios especiales. – TrueWill

5

¿Lo está buscando?

ContactNumbers = new List<ContactNumber>(){ new ContactNumber("555-5555"), 
              new ContactNumber("555-1234"), 
              new ContactNumber("555-5678") }; 
+0

gracias Joce, por favor vea mi edición. – haansi

Cuestiones relacionadas