Eu tenho a pergunta "melhores práticas" sobre POO em C # (mas isso se aplica a todos os idiomas).
Considere ter uma classe de biblioteca com um objeto a ser exposto ao público, por exemplo, via acessador de propriedade, mas não queremos que o público (pessoas que usam essa classe de biblioteca) o altere.
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, a melhor abordagem é a "opção C", mas muito poucos objetos possuem a variante ReadOnly (e certamente nenhuma classe definida pelo usuário a possui).
Se você fosse usuário da classe A, esperaria mudanças no
List<string> someList = ( new A() ).Items;
propagar para o objeto original (A)? Ou está certo devolver um clone desde que tenha sido escrito em comentários / documentação? Eu acho que essa abordagem de clone pode levar a erros bastante difíceis de rastrear.
Lembro que em C ++ poderíamos retornar objetos const e você só poderia chamar métodos marcados como const nele. Eu acho que não existe esse recurso / padrão no c #? Se não, por que eles não o incluiriam? Eu acredito que é chamado const correção.
Mas, novamente, minha pergunta principal é sobre "o que você esperaria" ou como lidar com a Opção A vs B.