Al implementar una incubadora para una propiedad de la lista (en C#) es una mala cosa es escribir es como:Lista de propiedades Setter
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = value; }
}
En caso de que no se puede escribir como:
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = new List<string>(value); }
}
Hasta hasta hoy he usado típicamente el primero, pero recientemente encontré un código que usaba el último y parecía que esta es probablemente la forma correcta de implementar esto.
No utilizará el anterior causa que la propiedad TheList se modifique cuando se realicen cambios en la lista externa que se le asigna. Por ejemplo:
List<string> list = new List<string>();
list.Add("Hello");
var c = new someClass();
c.TheList = list;
Usando el antiguo será el siguiente código no romper la encapsulación de theList:
list.Clear();
Ahora c.TheList también está vacía, que puede no ser lo que queríamos. Sin embargo, utilizando el último enfoque, c.TheList no se borrará.
No, la segunda solución no es correcta. Utilice la primera solución y si desea establecer una copia en lugar de una referencia, escriba c.TheList = new List (list); –
vorrtex
Eso depende de la semántica de tu propiedad. Es posible que algunas personas que llaman puedan configurar la lista y aún actualizarla "desde afuera". Cualquiera que sea el camino que tome, asegúrese de documentarlo adecuadamente. –
Gracias por todas las excelentes respuestas. Me alegro de no haber empezado a utilizar el segundo enfoque sin antes verificarlo. Parece que el consenso es no proporcionar un colocador (en la mayoría de los casos) o, al menos, protegerlo. – mikesigs