Tengo una pregunta de "mejores prácticas" sobre OOP en C # (pero se aplica a todos los idiomas).
Considere tener una clase de biblioteca con un objeto que se expondrá al público, digamos a través del descriptor de acceso de propiedad, pero no queremos que el público (las personas que usan esta clase de biblioteca) lo modifiquen.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
Obviamente, el mejor enfoque es la "opción C", pero muy pocos objetos tienen la variante ReadOnly (y ciertamente ninguna clase definida por el usuario la tiene).
Si fuera el usuario de la clase A, ¿esperaría cambios en
List<string> someList = ( new A() ).Items;
propagarse al objeto original (A)? ¿O está bien devolver un clon siempre que se haya escrito así en comentarios / documentación? Creo que este enfoque de clonación podría conducir a errores bastante difíciles de rastrear.
Recuerdo que en C ++ podríamos devolver objetos const y solo podría llamar a los métodos marcados como const en él. Supongo que no hay tal característica / patrón en C #? Si no, ¿por qué no lo incluirían? Creo que se llama corrección constante.
Pero, de nuevo, mi pregunta principal es sobre "qué esperarías" o cómo manejar la Opción A vs B.